matlotlibでアニメーションを実装する場合、ArtistAnimationを利用する方法と、FuncAnimationを利用する方法の大きく2つあります。
一般的にArtistAnimationの方が実装は簡単である一方で、作成した画像を全てメモリに読み込む必要性があるため、大容量のデータを扱う際にはFuncAnimationが向いています。FuncAnimationは、対応する関数を実行しながら逐次アニメーションを作成するため比較的負荷が少なくアニメーションを実装することができますが、少し扱い方が難しく、慣れるまで少し大変というデメリットがあります。
今回は、matpliotlibでアニメーションを作成した経験が少ない人や、matpliotlibでアニメーションを作る機構について理解したい人に向けに、ArtistAnimationを利用してアニメーションを作る方法について解説します。
とりあえず、今すぐにアニメーションが作りたい!という人や、今までコピペでアニメーションを実装していたけど理解して使いたい!という人向けの記事になっています。
- matplotlibのArtistAnimationの機構について理解する
- ArtistAnimationを用いてアニメーションを作成する
ArtistAnimationの機構(仕組み)について理解する
Artistアニメーションの仕組みについてですが、非常に簡単です。
動画をイメージにすると、動画は多数の画像が高速に流れることで動きがあるように見えます。動画を構成する1枚1枚の画像のことをフレームと言ったりします。
ArtistAnimationでは、単純にアニメーションさせたい画像を多数用意して、それを配列として保持し、最後にmatplotlibのArtistAnimationオブジェクトに引数として渡すことで、簡単にアニメーションを作成することができます。
ArtistAnimationを用いたアニメーション作成のイメージはこのような感じです。
matplotlibのArtistAnimationでアニメーションを作成する
ここまでですごく簡単に、ArtistAnimationの仕組みを説明したので、次は実際にコードを書いて、アニメーションを実際に作成する実装をしていきましょう。
今回は、次のような$sin$関数が時間経過と共に描写されるようなアニメージョンを実装します。
実装は次のようになっています。
ArtistAnimationを用いることで、非常にシンプルなコードでアニメーションを作成することができます。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import ArtistAnimation
x_min = 0
x_max = 10 * np.pi
x_range = np.linspace(2, x_max, 100)
fig, ax = plt.subplots()
ax.set_xlim([x_min, x_max])
frames = []
for x in x_range:
xs = np.linspace(0, x, 100)
y = np.sin(xs)
frame = ax.plot(xs, y)
frames.append(frame)
ani = ArtistAnimation(fig, frames, interval=5)
ani.save("animation.gif", writer="pillow")
最初に提示したステップと照らし合わせることで、仕組みが理解できると思いますが、とても簡単にアニメーションが作成できることがわかります。