Pythonのグラフ描画ライブラリMatplotlib
ではアニメーションも作成できますが、初めての人には少し複雑です…。
そこで、今回は
Matplotlib
でアニメーションを描きたいけど、よくわからない!- 試しにやってみたけど、アニメーションが動かない…。
という方のために、
Matplotlib
でアニメーションを超簡単に作成・保存する方法- アニメーション作成用の超基本テンプレ
を画像・サンプルコード付きで紹介していきます!
今回は、初心者の方向けにArtistAnimation
でサクッとアニメーションを作成する方法を紹介しています。
- Matplotlibでアニメーションを作成する2つの方法
- Jupyter Notebookの場合の注意点
- ArtistAnimationでアニメーション作成
- 【応用編】複数要素を同時にアニメーション化
- アニメーションの保存方法
- まとめ
Matplotlibでアニメーションを作成する2つの方法
Matplotlib
でアニメーションを作成するには、matplotlib.animation
モジュールのクラスを使用します。
ArtistAnimation
クラスかFuncAnimation
クラスを使いますが、それぞれ次のような特徴があります。
ArtistAnimation
クラス:- 事前にグラフ要素を複数作成
- それらを組み合わせてアニメーションにする
FuncAnimation
クラス:- 事前にグラフ更新用関数を作成
- 関数を実行しながらアニメーションにする
今回は、比較的簡単なArtistAnimation
クラスの使い方を紹介します。
Jupyter Notebookの場合の注意点
Jupyter Notebookの場合、%matplotlib inline
でMatplotlib
を読み込んでも、アニメーションは表示できません。
Jupyter Notebook上でアニメーションを表示するには、Matplotlib
読み込み時に次のコードを実行します。
%matplotlib notebook
from matplotlib import pyplot as plt
%matplotlib notebook
で読み込むと、Matplotlib
のバックエンド(内部処理方法)が変更されて、動画を表示できるようになります。
%matplotlib
について、詳しく知りたい方は次の記事をチェックしてください。
ArtistAnimationでアニメーション作成
アニメーション作成では、
ArtistAnimation
クラスのanim
オブジェクトを作成すること
が一つ目のゴールになります。
from matplotlib.animation import ArtistAnimation
anim = ArtistAnimation(fig, artist)
ArtistAnimation
の必須引数の意味は次の通りです。
引数名 | 解説 |
---|---|
Fig |
アニメーションを描くfigure |
Artists |
アニメーション化するグラフ要素のリスト |
Matplotlib
では、グラフの要素はartist
と名付けられているので、引数名もartists
となっています。
ArtistAnimation
では、
- 事前にグラフ要素(
artist
)を複数用意、リスト化(artists
) artists
を組み合わせてアニメーションにする
と考えるとわかりやすいです。
図にすると次のようなイメージです。
ArtistAnimationの基本形
基本的には次の手順を踏みます。
- 必要なモジュールの読み込み
- グラフ領域の作成 ⇒
fig
の準備 - アニメーション用のグラフ要素リストの作成 ⇒
artists
の用意 - アニメーション化 ⇒
ArtistAnimation
インスタンス作成
簡単なアニメーションを例に、手順を見ていきましょう。
# 1. 必要なモジュールの読み込み
%matplotlib notebook
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.animation import ArtistAnimation
# 2.グラフ領域の作成
fig, ax = plt.subplots()
# 3. グラフ要素のリスト(artists)作成
artists = []
for i in range(100):
x = np.linspace(0, 4*np.pi)
y = np.sin(x - i/100 * 2*np.pi)
artist = ax.plot(x, y,"blue")
artists.append(artist)
# 4. アニメーション化
anim = ArtistAnimation(fig, artists)
plt.show()
これを実行すると次のようなアニメーションが出力されます。
ポイントは、3. アニメーション要素のリスト作成です。
i = 0~99
で、for文
を回しながら、グラフ要素(artist
)を複数作成- 全
artist
をリストartists
に追加
これで、アニメーション要素のリストartists
が作成されます。
最後に
ArtistAnimation
クラスで、artists
をもとにしたanim
オブジェクト作成plt.show()
で表示
しています。
引数によるアニメーションの詳細設定
オプショナル引数で、アニメーションの作成方法の詳細設定が可能です。
引数名 | 解説 |
---|---|
interval |
フレームの間隔 デフォルト: 200 ミリ秒 |
repeat_delay |
動画を繰り返す場合、繰り返し間の待機時間 デフォルト: 0 ミリ秒 |
repeat |
動画を繰り返すかどうかTrue or False デフォルト: True |
blit |
ブリッティングするかどうかTrue or False デフォルト: False |
ブリッティングとは、アニメーション作成時の処理手法です。ブリッティングした方が、処理が高速になります。
以下は、interval
を調整した例です。
anim = ArtistAnimation(fig, artists, interval=10, repeat_delay=1000)
plt.show()
フレームの間隔を短くしています。
【応用編】複数要素を同時にアニメーション化
ArtistAnimation
の引数artist
をリスト内リスト形式にして、複数の要素をアニメーション化するように設定できます。
次のように各フレームの要素を一つのリストとして、リスト内リストを作成します。
artists = [[frame1の要素1, frame1の要素2,...],
[frame2の要素1, frame2の要素2,...],
[frame3の要素1, frame3の要素2,...],...]
これを利用して、
- タイトルやテキストを更新するアニメーション
- 複数グラフのアニメーション
を作成する方法を紹介します。
【応用編①】タイトルやテキストを更新するアニメーション
plt.text()
を利用して、タイトルとテキストを更新するアニメーションを作成してみます。
# 3. アニメーション要素のリスト
artists = []
for i in range(100):
x = np.linspace(0, 4*np.pi)
y = np.sin(x - i/100 * 2*np.pi)
# アニメーション化する要素の準備
my_line, = ax.plot(x, y,"blue")
my_text = ax.text(0, y[0], " ⇐ inlet", color="darkblue", size ="large")
my_title = ax.text( 4.5, 1.15, f"Count = {i}", size="xx-large")
# アニメーション化する要素をリスト化
artists.append([my_line, my_text, my_title])
# 4. アニメーション化
anim = ArtistAnimation(fig, artists, , interval=50)
plt.show()
次のようなアニメーションになります。
artists.append([my_line, my_text, my_title])
で、各フレームの更新要素をリスト内リストにしている点がポイントです。
ax.title()
はアニメーションに対応していないので、タイトルもax.text()
で行います。
ax.text()
について詳しく知りたい方は、次の記事をチェックしてください。
【応用編②】複数グラフのアニメーションを同時に表示
次のようにして、artists
を用意すると複数グラフのアニメーションを作成できます。
plt.subplots()
で、サブプロット領域を複数用意- 各プロットを更新するように
artists
を用意
一つの図の中で、2つのプロットをアニメーション化する例を紹介します。
# 2.グラフ領域の作成
fig, axes = plt.subplots(1,2)
# 3. アニメーション要素のリスト
artists = []
for i in range(100):
x = np.linspace(0, 4*np.pi)
y = np.sin(x - i/100 * 2*np.pi)
my_line1, = axes[0].plot(x, y,"b")
my_line2, = axes[1].plot(y, x,"r")
# アニメーション化する要素をリスト化
artists.append([<a id="_Hlk60231885"></a>my_line1, my_line2])
# 4. アニメーション化
anim = ArtistAnimation(fig, artists, interval=10)
plt.show()
次のようなアニメーションになります。
artists.append([my_line1, my_line2])
で、各フレームのグラフをリスト内リストにしている点がポイントです。
アニメーションの保存方法
保存には、作成したanim
オブジェクトのsave
メソッドを使用します。
anim.save("ファイル名.拡張子")
ただし、保存形式によってそれぞれ必要な準備・設定があります。
ここでは、
- mp4形式
- gif形式
で保存する方法を紹介します。
mp4で保存
mp4で保存するためには、ffmpeg
という外部ライブラリを使用します。
使用環境に応じて、conda
またはpip
でインストールする必要があります。
conda install ffmpeg
pip install ffmpeg-python
ffmpeg
をインストールできれば、
anim.save("ファイル名.mp4")
で保存可能です。
anim = ArtistAnimation(fig, artists)
anim.save("sin_anim.mp4")
# ⇒ カレントフォルダにmp4出力
ffmpeg
をインストールしておけば、比較的簡単に出力できますね。
gifで保存
アニメーションをgifで保存するためには、pillow
という外部ライブラリを使用します。
インストールしていない場合は、conda
またはpip
でインストールする必要があります。
conda install pillow
pip install Pillow
pillow
をインストールしたら、
anim.save("ファイル名.gif", writer="pillow")
で保存可能です。
anim = ArtistAnimation(fig, artists)
anim.save("sin_anim.mp4")
# ⇒ カレントフォルダにgif出力
pillow
以外にも、Imagemagick
というものを使用する方法もありますが、pillow
の方が簡単に設定できます。
まとめ
ArtistAnimation
クラスで、アニメーションを作成する方法を紹介しました。
- 事前にグラフ要素(
artist
)を複数用意、リスト化(artists
) artists
を組み合わせてアニメーションにする
というところがポイントです!
Matplotlib
マスターを目指す皆さんへの次のおススメコンテンツはこちらです!
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!