[matplotlib animation] 1. プロットのマーカーを画像としてアニメーション表示

matplotlib Animation

はじめに

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>となる。

AnnotationBboximを(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の場合は、.xyboximの位置を順次変更していく。

アニメーションの表示

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すれば良い。

参考

  1. 代数螺旋 – Wikipedia

コメント