[matplotlib animation] 57. FuncAnimationとArtistAnimationの違い

matplotlib

はじめに

この記事では、matplotlibのアニメーション表示に使用される2つの関数「FuncAnimation」と「ArtistAnimation」の違いについて解説します。同じアニメーションを両方の方法で実装し、それぞれの特徴や使い分けのポイントを比較検討しています。

FuncAnimationの特徴

FuncAnimationは、更新関数(update function)を定義し、その関数を一定間隔で呼び出すことでアニメーションを生成します。更新関数は各フレームごとに実行され、グラフの状態を変更します。

  • メリット: メモリ効率が良く、長時間のアニメーションや無限ループに適しています
  • リアルタイム処理: データが逐次的に生成される場合に適しています
  • 柔軟性: 各フレームで複雑な計算や条件分岐を行うことができます

ArtistAnimationの特徴

ArtistAnimationは、事前に各フレームの画像(Artist objects)をリストとして用意し、それを順番に表示することでアニメーションを生成します。

  • 事前準備型: すべてのフレームを事前に生成するため、表示時の処理が軽くなります
  • 細かい制御: 各フレームを個別に細かく制御できます
  • メモリ消費: すべてのフレームをメモリに保持するため、フレーム数が多い場合はメモリ消費が大きくなります

コード

コード(ArtistAnimation)

コード(FuncAnimation)

コードをダウンロード(.pyファイル) コードをダウンロード(.ipynbファイル)

解説

モジュールのインポート

データ生成関数

関数generateはZデータ出力用の関数となります。

AritistAnimationによるアニメーション

ArtistAnimationによるアニメーションの表示ついては下記で解説しました。

[matplotlib 3D] 26. ArtistAnimationで3D wireframe plotをアニメーションで表示
Matplotlibを使用した3Dワイヤーフレームプロットのアニメーション表示方法について解説します。ArtistAnimationを活用して動的な3Dグラフィックスを作成する手順とコード例を紹介。

FuncAnimationによるアニメーション

FuncAnimationでは事前にZ_listにZのデータを生成しておき、update関数でwireframeグラフを消去して再表示する処理を繰り返すことでアニメーションを実現しています。

ファイルサイズの比較

ArtistAnimationで保存したmp4ファイルのサイズは465 KB、FuncAnimationで保存したmp4ファイルのサイズは359 KBでした。つまり、FuncAnimationの方がArtistAnimationより軽量なファイルを生成することがわかりました。

コードの所要時間の比較

ArtistAnimationの所要時間計測

FuncAnimationの所要時間計測

ArtistAnimationが1分26秒かかったのに対して、FuncAnimationは17.6秒で済み、FuncAnimationの方が実行時間が大幅に短いことがわかりました。

パフォーマンスの考慮点

アニメーションを作成する際は、パフォーマンスについても考慮する必要があります。特に大量のデータを扱う場合や、複雑な計算を行う場合は、以下の点に注意しましょう。

  • blitパラメータの活用: True に設定すると、変更された部分のみを再描画するため、パフォーマンスが向上します
  • フレームレートの調整: interval パラメータで調整可能です
  • 描画要素の最適化: 必要最小限の描画要素に抑えることでパフォーマンスが向上します

まとめ

FuncAnimationとArtistAnimationはどちらもmatplotlibでアニメーションを作成するための強力なツールですが、異なるアプローチと特性を持っています。アニメーションの目的、データの性質、メモリ制約などを考慮して、適切な方を選択することが重要です。リアルタイムや動的なデータの可視化にはFuncAnimation、事前に計算された複雑なフレームのアニメーションにはArtistAnimationが適しています。

参考

matplotlib.animation.ArtistAnimation — Matplotlib 3.10.6 documentation
matplotlib.animation.FuncAnimation — Matplotlib 3.10.6 documentation

コメント