Pythonでグラフ(Matplotlib)のアニメーションを作る(FuncAnimation編)
Pythonのmatplotlibを使って、グラフのアニメーションを作ります。ここでは、グラフを描く関数を続けて呼び出してアニメーションを作ってみます。また、アニメーションをPillowで出力します。
目次
FuncAnimationクラスの使い方
MatplotlibのAnimationパッケージのFuncAnimationを使うと、グラフを描く関数を連続して呼び出すことでグラフのアニメーションを描けます。
ani = matplotlib.animation.FuncAnimation(fig, func, [frames], [init_func], [fargs], [save_count], [cache_frame_data], [interval], [repeat], [repeat_delay])
変数 |
型 |
内容 |
---|---|---|
fig |
Figure |
matplotlibのFigureオブジェクト。グラフの描画先の指定。 |
func |
1フレーム毎に呼び出す関数を指定する。 |
|
frames |
省略可。既定値はNone。intやイテレータまたはジェネレータ。1フレーム毎にfuncに指定した関数に渡す値。 |
|
init_func |
省略可。既定値はNone。アニメーションの最初に実行する関数を指定する。 |
|
fargs |
tuple |
省略可。既定値はNone。funcに指定した関数に渡す追加の引数。タプルで渡す。 |
save_count |
int |
省略可。既定値はNone。キャッシュするフレーム数。 |
cache_frame_data |
bool |
省略可。既定値はTrue。フレームをキャッシュするかどうか。 |
interval |
number |
省略可。既定値は200。フレームの更新間隔。単位はミリ秒。 |
repeat |
bool |
省略可。既定値はTrue。アニメーションをリピートするかどうか。 |
repeat_delay |
number |
省略可。既定値はNone。リピートするときの停止時間。単位はミリ秒。 |
ani |
FuncAnimationオブジェクト。 |
FuncAnimationの使用例
これだけではちょっとわかりにくいですね。
実施例を見てみましょう。y = sin(x)のxの値を変えて、波をずらしていくアニメーションです。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
def update(frame):
plt.cla()
x = np.linspace(0, 2*np.pi, 201)
y = np.sin(x + float(frame)/100.0)
plt.plot(x,y,'b')
fig = plt.figure(figsize=(4,3), dpi=100)
ani = animation.FuncAnimation(fig, update, frames=range(0,2*314,10), interval=50)
#plt.show() # これを実行するとアニメーションが表示される。
w = animation.PillowWriter(fps=20)
ani.save('animation_test.gif', writer=w)
FuncAnimationの1番目の引数には、グラフをプロットするmatplotlibのFigureを指定します。
FuncAnimationの2番目の引数に、グラフを描く関数を指定します。上記の例ではupdateという関数ですね。
FuncAnimationの3番目の引数が、rangeになっています。このrangeは、0から628までの整数を10刻みで返すイテレータです。1フレーム毎に0, 10, 20という感じでupdate関数に値を渡してくれます。
この値をupdate関数は1番目の引数として受け取ります。上記の例ではframeという変数で受け取ってますね。そして、sin関数の中でxの値をずらすのに使用されています。
FuncAnimationの4番目の引数は、intervalになっています。intervalが50ミリ秒ということは、20fpsですね。
update関数に複数の値を渡したいときは、FuncAnimationの引数にfargs=(x, y, z)という形で指定すれば、update(frame, x, y, z)という形で渡せます。
アニメーションをPillowで出力する
ImageMagickがインストールされていない環境でアニメーションをファイル出力したい場合があります。そういう場合は、Pillowを使ってGIFファイルに出力できます。
writer = matplotlib.animation.PillowWriter([fps])
変数 |
型 |
内容 |
---|---|---|
fps |
int |
省略可。既定値は5。フレーム更新速度。fps。 |
writer |
PillowWriterオブジェクト。 |
あらかじめPillowWriterオブジェクトを作っておきます。
そして、FuncAnimationオブジェクトのsaveメソッドを実行するときのwriter引数にPillowWriterオブジェクトを指定すると、PillowがアニメーションGIFを出力してくれます。
公開日
広告
Pythonでグラフカテゴリの投稿
- Pythonで3Dグラフを描く
- PythonでGIFアニメを作る(PILでアニメーションファイルを出力編)
- Pythonでグラフのアニメを作る(OpenCVでmp4ファイルを出力編)
- Pythonでグラフのコンテナを作る
- Pythonでグラフを描く
- Pythonでグラフ(Matplotlib)のアニメーションを作る(ArtistAnimation編)
- Pythonでグラフ(Matplotlib)のアニメーションを作る(FuncAnimation編)
- PythonのMatplotlibのグラフに領域を指示して最大値と最小値を取得する
- PythonのMatplotlibのグラフに領域を指示して最大値と最小値を取得する(GUI版)
- PythonのMatplotlibのグラフをNumPy行列に変換してOpenCVやPillowで使う
- Pythonのグラフのひな形