はじめに
matplotlibのFuncAnimationとAnnotationBboxでタートルグラフィックスのようなアニメーションを表示する方法について解説する。
コード
解説
画像の読み込み
image = 'cactus7.png'
image = plt.imread(image)
im = OffsetImage(image, zoom=.3)
imageをplt.imread
で読み込んで、OffsetImage
に入れる。OffsetImage
とはOffsetbox
の一種で画像をいれる箱のようなもの。zoom
で大きさを調整できる。
グラフと挿入する画像の設定
ln, = plt.plot(xdata, ydata, 'r', lw=9, animated=True)
annotation = AnnotationBbox(im,(xdata[0], ydata[0]),xycoords='data', frameon=False)
artists.append(ax.add_artist(annotation))
plt.plot
でグラフ作ってそれをln,
とする。
ここで、ln,
とすると、ln,
は(<matplotlib.lines.Line2D at 0x7f5ec015b668>,)となって、ln=
と,を抜くと、ln
は<matplotlib.lines.Line2D at 0x7f5ec140b8d0>となる。
AnnotationBbox
でim
を(xdata[0], ydata[0])に表示する。xycoords='data'
はannotateする位置の設定で、'data'
の場合、グラフのデータを基準として位置を決める。 frameon=False
で枠なしのannotationとなる。
artists.append(ax.add_artist(annotation))でaxにannotationを追加して、さらに、空のartistsのリストにそれを追加する。
アニメーションの初期設定
def init():
ax.set_xlim(-25, 25)
ax.set_ylim(-25, 25)
ax.set_aspect('equal')
ax.axis('off')
#ax.patch.set_facecolor('gold') # 図全体の背景色
def init():
でアニメーションの初期設定をする。ax.axis('off')
で軸を非表示にしている。ax.patch.set_facecolor
で背景色を変えられるが、この場合、ax.axis(‘off’)をコメントアウトして無効化する必要がある。
アニメーションの設定
def update(i):
x_i = 0.5 * i * np.cos(i)
y_i = 0.5 * i * np.sin(i)
xdata.append(x_i)
ydata.append(y_i)
ln.set_data(xdata, ydata)
annotation.xybox = (x_i,y_i)
return ln, annotation
def update(i):
でアニメーションの設定をする。x_i, y_i
は螺旋の式[1]。.append
でデータを追加していき、.set_data
でグラフに反映させる。AnnotationBbox
の場合は、.xybox
でim
の位置を順次変更していく。
アニメーションの表示
ani = FuncAnimation(fig, update, frames=np.linspace(0, 16*np.pi, 300),
interval=100,init_func=init, blit=False)
HTML(ani.to_html5_video())
figでanimateを実行する。frames=np.linspace(0, 16*np.pi, 300)は螺旋が8回転する範囲で設定。interval=100は1コマ100msで順次, 次のにしていくので100 ms*300で30 sの動画となる。
HTML()でaniをHTML5のビデオにして出力。
アニメーションの保存
dpi=100
ani.save('rasen.mp4', writer="ffmpeg",dpi=dpi)
画質上げて保存したい場合は、dpiを設定して、ani.saveすれば良い。
コメント