YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

Matplotlib アニメーション作成入門編 |ArtistAnimation徹底解説!

Pythonのグラフ描画ライブラリMatplotlibではアニメーションも作成できますが、初めての人には少し複雑です…。

そこで、今回は

  • Matplotlibでアニメーションを描きたいけど、よくわからない!
  • 試しにやってみたけど、アニメーションが動かない…。

という方のために、

  • Matplotlibでアニメーションを超簡単に作成・保存する方法
  • アニメーション作成用の超基本テンプレ

を画像・サンプルコード付きで紹介していきます!

今回は、初心者の方向けにArtistAnimationでサクッとアニメーションを作成する方法を紹介しています。

 

Matplotlibでアニメーションを作成する2つの方法

Matplotlibでアニメーションを作成するには、matplotlib.animationモジュールのクラスを使用します。

ArtistAnimationクラスかFuncAnimationクラスを使いますが、それぞれ次のような特徴があります。

  • ArtistAnimationクラス:
    • 事前にグラフ要素を複数作成
    • それらを組み合わせてアニメーションにする
  • FuncAnimationクラス:
    • 事前にグラフ更新用関数を作成
    • 関数を実行しながらアニメーションにする

今回は、比較的簡単なArtistAnimationクラスの使い方を紹介します。

Jupyter Notebookの場合の注意点

Jupyter Notebookの場合、%matplotlib inlineMatplotlibを読み込んでも、アニメーションは表示できません。

Jupyter Notebook上でアニメーションを表示するには、Matplotlib読み込み時に次のコードを実行します。

%matplotlib notebook
from matplotlib import pyplot as plt

%matplotlib notebookで読み込むと、Matplotlibのバックエンド(内部処理方法)が変更されて、動画を表示できるようになります。

%matplotlibについて、詳しく知りたい方は次の記事をチェックしてください。

≫matplotlib inline の謎解明! |「書けと言われたので書いています」から卒業
≫matplotlib inline の謎解明! |「書けと言われたので書いています」から卒業
Jupyter Notebookでmatplotlibを使用する場合には、インポートする前に%matplotlib inlineと記述します。なぜinlineと入力しているのでしょうか?この記事では、matplotlib inlineの謎について解説していきたいと思います!
www.yutaka-note.com/entry/matplotlib_inline
 

ArtistAnimationでアニメーション作成

アニメーション作成では、

  • ArtistAnimationクラスのanimオブジェクトを作成すること

が一つ目のゴールになります。

from matplotlib.animation import ArtistAnimation
anim = ArtistAnimation(fig, artist)

ArtistAnimationの必須引数の意味は次の通りです。

引数名 解説
Fig アニメーションを描くfigure
Artists アニメーション化するグラフ要素のリスト

Matplotlibでは、グラフの要素はartistと名付けられているので、引数名もartistsとなっています。

ArtistAnimationでは、

  • 事前にグラフ要素(artist)を複数用意、リスト化(artists
  • artistsを組み合わせてアニメーションにする

と考えるとわかりやすいです。

図にすると次のようなイメージです。

ArtistAnimationの基本形

基本的には次の手順を踏みます。

  1. 必要なモジュールの読み込み
  2. グラフ領域の作成 ⇒ figの準備
  3. アニメーション用のグラフ要素リストの作成 ⇒ artistsの用意
  4. アニメーション化 ⇒ 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()について詳しく知りたい方は、次の記事をチェックしてください。

≫matplotlib pyplot.text |matplotlibのテキスト表示をマスターせよ!
≫matplotlib pyplot.text |matplotlibのテキスト表示をマスターせよ!
グラフ内にテキストでコメントを記入することってよくありますよね?グラフにコメントがあると、グラフの大事な部分を強調して説明できます。この記事では、matplotlibでグラフ内にテキストを表示する方法、テキストの見た目の変更方法について図解・サンプルコード付きで解説しています!
www.yutaka-note.com/entry/2020/01/08/080413
 

【応用編②】複数グラフのアニメーションを同時に表示

次のようにして、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マスターを目指す皆さんへの次のおススメコンテンツはこちらです!

≫matplotlib inline の謎解明! |「書けと言われたので書いています」から卒業
≫matplotlib inline の謎解明! |「書けと言われたので書いています」から卒業
Jupyter Notebookでmatplotlibを使用する場合には、インポートする前に%matplotlib inlineと記述します。なぜinlineと入力しているのでしょうか?この記事では、matplotlib inlineの謎について解説していきたいと思います!
www.yutaka-note.com/entry/matplotlib_inline
 
≫matplotlib pyplot.text |matplotlibのテキスト表示をマスターせよ!
≫matplotlib pyplot.text |matplotlibのテキスト表示をマスターせよ!
グラフ内にテキストでコメントを記入することってよくありますよね?グラフにコメントがあると、グラフの大事な部分を強調して説明できます。この記事では、matplotlibでグラフ内にテキストを表示する方法、テキストの見た目の変更方法について図解・サンプルコード付きで解説しています!
www.yutaka-note.com/entry/2020/01/08/080413
 
≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
伝わるグラフを作るためのポイントはなんでしょうか?いかに視覚的にわかりやすいか、これが大切です。それには重要な要素に色をつけて、視覚的にうったえることが超大切!この記事では、matplotlibでの色の指定方法について、基本から応用まで徹底解説!
www.yutaka-note.com/entry/matplotlib_color
 
≫Matplotlib 軸周り完璧マスターガイド | 軸・軸目盛・目盛り線の設定
≫Matplotlib 軸周り完璧マスターガイド | 軸・軸目盛・目盛り線の設定
Matplotlibで大変なのが軸周りの設定!グラフの「この要素」を変更するには、「どのメソッド」を使えばいいのかわからない…。という方のために、Matplotlibの軸・目盛り・目盛り線の設定について総まとめしました!これで軸周りの設定がだいぶ楽になります。軸周り完ぺきマスターガイド!
www.yutaka-note.com/entry/matplotlib_axis
 
≫Matplotlib 棒グラフを徹底解説|複数系列・積み上げ棒グラフ全てOK
≫Matplotlib 棒グラフを徹底解説|複数系列・積み上げ棒グラフ全てOK
Matplotlibで棒グラフを作成する方法がよくわからない…。 棒グラフで悩むなら、MatplotlibあきらめてExcel使おうかな…。 と思ったことはありませんか?そんな方のために、Matplotlibの棒グラフ作成方法を徹底的に解説しました!複数系列?積み上げ棒グラフ?全部大丈夫!
www.yutaka-note.com/entry/matplotlib_bar
 
≫Matplotlib 散布図を徹底解説!|基本設定からバブルチャートまで
≫Matplotlib 散布図を徹底解説!|基本設定からバブルチャートまで
Matplotlibで散布図を作成する方法がよくわからない…。散布図って何のためにあるの?全部、plt.plotでグラフ作ればよくない?という方のために、「Matplotlibの散布図の作成方法、散布図を応用したデータの可視化例」についてまとめしました!
www.yutaka-note.com/entry/matplotlib_scatter
 
≫Matplotlib 円グラフ作成方法|Excel風グラフ、ドーナツグラフも解説
≫Matplotlib 円グラフ作成方法|Excel風グラフ、ドーナツグラフも解説
Matplotlibで円グラフを作成する方法がよくわからない…。何を設定すれば、自分の描きたい円グラフになるのかわからない!という方のために、「Matplotlibの円グラフ作成方法」、「Excel風の見た目に設定する方法」、「グラフやラベルの設定方法」についてまとめしました!これで自由に円グラフを作成できます!
www.yutaka-note.com/entry/matplotlib_pie
 
≫Matplotlib subplotの使い方徹底図解!|一つの図に複数グラフを描く
≫Matplotlib subplotの使い方徹底図解!|一つの図に複数グラフを描く
Matplotlibで一つの図の中に複数のグラフを並べるにはどうすればいいの?subplotでグラフを並べられるらしいけど、使い方がよくわからない!という方のために、「plt.subplot()の基本的な使い方」を画像付きで解説していきます!plt.subplot()でプロットをキレイに配置して、見やすく人に伝わるグラフを目指しましょう!
www.yutaka-note.com/entry/2020/01/02/232925
 
≫【完全保存版】Matplotlib plt.plot徹底解説 | 基本操作を総まとめ!
≫【完全保存版】Matplotlib plt.plot徹底解説 | 基本操作を総まとめ!
Matplotlibのplt.plotを使用したグラフを作成、グラフの見た目変更、タイトルや軸の設定など基本事項について徹底解説!!この記事を読めば、plt.plotで手軽に手早く簡単に、キレイなグラフ作成可能に!?
www.yutaka-note.com/entry/matplotlib_pyplot
 

Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。

気楽にツイートしているので、気軽にフォローしてください!