質問: 0.3) ax.set_aspect('equal') ax.set_title(str(k) + ".png") fig.savefig(str(k) + '.png') plt.close(fig) ```
回答: animation.ArtistAnimation クラスについて ``` animation.ArtistAnimation(fig, artists, *args, **kwargs) ``` * fig: Figure オブジェクト * artists: 各フレームを構成する Artist の一覧 * interval: 各フレームの表示間隔 (ミリ秒)。デフォルトは 200 ms。 * repeat_delay: リピートする場合、リピートする前の遅延を ms で指定する。デフォルトは None。 * repeat: リピートするかどうか。デフォルトは True。 matplotlib でアニメーションを作成するポイント 1. Figure、Axes を作成する。 2. 各フレームで表示する Artist のリストを作成する。 ``` [フレーム1で表示する Artist], [フレーム2で表示する Artist]: ``` Axes.plot() などグラフ作成の関数は、それを構成する Artist を返すようになっているので、 それをリストに詰めていってください。 1. ArtistAnimation() に渡す。 2. ArtistAnimation.save() で保存する。 Ipython Notebook を利用している場合は、冒頭に以下を入れると、`plt.show()`で Notebook 上に表示できます。 ``` %matplotlib nbagg ``` Artist とは グラフを構成するオブジェクトです。 例えば、折れ線グラフは、Line2D という Artist で構成されています。 Axes.plot() などの関数は返り値として、そのグラフを構成する Artist を返すようになっています。 より詳しくは こちら や こちら などを参考にしてください。 サンプルコード ``` import matplotlib.pyplot as plt import numpy as np from matplotlib.animation import ArtistAnimation from mpl_toolkits.mplot3d import Axes3D from scipy.stats import multivariate_normal # (x, y) の点の一覧を作成する。 x = np.linspace(-5, 5, 1000) y = np.linspace(-5, 5, 1000) X, Y = np.meshgrid(x, y) XY = np.c_[np.ravel(X), np.ravel(Y)] ############################################# fig, axes = plt.subplots(figsize=(4, 4)) frames = [] # 各フレームを構成する Artist 一覧 for i in np.linspace(0, 4, 10): # 2次元正規分布の値を生成する。 mean = np.array([i, i]) sigma = np.eye(2) Z = multivariate_normal.pdf(x=XY, mean=mean, cov=sigma) Z = Z.reshape(X.shape) # 等高線グラフを作成する。 im = axes.contourf(X, Y, Z, 10, cmap=plt.cm.winter) # 等高線を構成する Artist 一覧を追加する。 print(im) # matplotlib.contour.QuadContourSet object artists = im.collections # QuadContourSet の collections 属性が Artist の一覧 frames.append(artists) # アニメーションを作成する。 anim = ArtistAnimation(fig, frames, interval=500) # gif 画像として保存する。 anim.save('animation.gif', writer='imagemagick') # mp4 で保存する場合は以下。ffmpeg がインストールされている必要がある。 # anim.save('anim.mp4', writer='ffmpeg', fps=4) # Figure を表示する。 fig.show() ``` 実行すると、2次元正規分布の中心が少しずつ右上に移動していくアニメーションgifが作成されます。 ![イメージ説明