GIFアニメーション
matplotlibのアニメーション作成は2つ種類があって、ArtistAnimationとFuncAnimationとがある。
ArtistAnimation は、あらかじめ全てのグラフを配列の形で用意しておき、それを1枚ずつ流すというものである。FuncAnimationは予め完成したグラフを渡すのではなく、アニメーションの1フレームごとに関数を実行する。データが巨大すぎる場合や潜在的に無限に続く場合に便利。
ArtistAnimation
ArtistAnimationを使って、xの2乗~10乗のグラフを配列に入れて、アニメーションをつくってみる。
サンプルコード
import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation def xpown(s, e): graphs = [] fig = plt.figure() for n in range(s, e + 1): x = np.arange(-100, 100, 0.1) y = x ** n g = plt.plot(x, y, label='y = x ** {}'.format(n)) graphs.append(g) plt.legend() ani = animation.ArtistAnimation(fig, graphs, interval=500) ani.save('pow1.gif', writer='imagemagick') if __name__ == '__main__': xpown(2, 10)
結果
これだと、10乗のグラフのyが大きすぎて、他がみんな直線みたいになってしまった。
FuncAnimation
FuncAnimationを使ってやってみる。
import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation x = np.arange(-100, 100, 0.1) n = 1 max = 10 fig = plt.figure() def plot_pow(data): plt.cla() global n n = n + 1 if n < max else 2 y = x ** n im = plt.plot(x, y, label='y = x ** {}'.format(n)) plt.legend() if __name__ == '__main__': ani = animation.FuncAnimation(fig, plot_pow, interval=400, frames=9) ani.save("pow2.gif", writer="imagemagick")
結果
指数が偶数ならy軸に対称のグラフになり、奇数なら原点に対象のグラフになります。原点に対象っていうのか。
Subplot
matplotlibで複数のグラフを表示したいときにsubplotが使えます。 参考:[Python]Matplotlibで複数のグラフを描画する方法
サンプルコード
import numpy as np import matplotlib.pyplot as plt x = np.arange(-100, 100, 0.1) fig = plt.figure() ax = [] for i in range(9): y = x ** (i ++ 2) ax.append(plt.subplot2grid((3, 3), (i // 3, i % 3))) ax[i].set_title('y = x ** {}'.format(i + 2)) ax[i].plot(x, y) plt.show()
結果