Pythonでグラフ(Matplotlib)のアニメーションを作る(FuncAnimation編)

Pythonのmatplotlibを使って、グラフのアニメーションを作ります。ここでは、グラフを描く関数を続けて呼び出してアニメーションを作ってみます。また、アニメーションをPillowで出力します。

目次

  1. FuncAnimationクラスの使い方
  2. FuncAnimationの使用例
  3. アニメーションを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でグラフカテゴリの投稿