Python – FuncAnimationによる動画表示

概要

Pythonのmatplotlibにはanimationパッケージがあり、ArtistAnimationFuncAnimationの2つのクラスが準備されている。

  • ArtistAnimationは、予め動画に表示する各フレームを生成しておいて、これらを動画として表示する
  • FuncAnimationは、全結果を保存せず、フレームごとに描画を実行する関数を実行して、動画して表示する

ここでは、FuncAnimationによる動画の表示方法を整理する(ArtistAnimationについてはこちら)。

1つのグラフの表示

流れ

  1. animationパッケージ又はArtistAnimationクラスをインポート
  2. グラフを描画する関数を定義
  3. FuncAnimationクラスのコンストラクターに描画関数を渡してインスタンスを生成
  4. 表示

処理ステップ

インポート

パッケージをインポートする

または

フレームリストの準備

動画の各フレームを保存するリストを準備する。animationパッケージでは、個々のグラフフレームをartistと表現している。

FigureとAxesオブジェクトを準備

フレームを描画するオブジェクトを準備しておく

1フレームを描画する関数を定義

4周期分の正弦関数を描画する関数を定義している。

  • ここではループごとにxを計算しているが、今回は全フレーム共通なので、ループの外で準備してもよい
  • plot命令のcolor指定をしないと、描画するごとに違うグラフとして色を変えて描画されてしまう

アニメーション設定して表示させる

FuncAnimationクラスのコンストラクターに必要な引数を与えてインスタンスを生成し、表示させる。intervalはフレーム間の待機時間で、ミリ秒で与える。

GIF画像として保存する

結果をGIF画像として保存するには、plt.show()を実行せず、以下のようにimagemagicでファイルとして書き出す。

frames=20でフレーム数を設定しているが、これがないとGIF保存のときにファイル容量が肥大化してしまう。それでも容量は800KB程度になり、ArtistAnimationのときの150KB程度よりも大きい。

実行結果

以下のような動画が表示される。

コード

全体の実行コードは以下のとおり。

複数のグラフの表示

流れ

全体の流れは単一のグラフの場合と同じ。リスト保存時に複数グラフを加算して重ね合わせるところだけが異なる。

  1. animationパッケージ又はArtistAnimationクラスをインポート
  2. グラフを描画する関数を定義し、複数のグラフをプロット
  3. FuncAnimationクラスのコンストラクターに描画関数を渡してインスタンスを生成
  4. 表示

処理ステップ

以下の描画関数が単一グラフの場合と異なる。関数の中で、異なる2つのグラフを描画している

実行結果

以下のように、2つのグラフが同時に表示される。

コード

全体の実行コードは以下のとおり。

描画関数に引数を渡す

描画関数に独自の引数を渡すことができる。

たとえば最初の「1つのグラフの表示」で、frame_countと表示する最大時刻max_xを引数とする場合、まず描画関数でこれらを引数として宣言し、関数内でこれを使った処理を書く。

FuncAnimationインスタンス生成時に、fargsで独自宣言した引数の値をタプルで与える。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です