YutaKaのPython教室

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

Matplotlib FuncAnimation徹底解説|更新用関数はこう作ればいい!

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

そこで、今回は

  • Matplotlibでアニメーションを描きたいけど、よくわからない!
  • FuncAnimationで更新用関数作るって何?意味不明!!

という方のために、

  • FuncAnimationでアニメーションを作成する超基本
  • 更新用関数update()の作成方法

について、必要な設定や引数がすぐわかるように、画像・サンプルコード付きで紹介していきます!

 

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

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

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

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

FuncAnimationは、関数を実行しながらアニメーションを作成します。

そのため、表示の面では効率が良いですが、設定は少し複雑です。

効率よりも手軽さ重視の場合は、次の記事のArtistAnimationを使用してみてください。

≫Matplotlib アニメーション作成入門編 |ArtistAnimation徹底解説!
≫Matplotlib アニメーション作成入門編 |ArtistAnimation徹底解説!
Matplotlibではアニメーションも作成できますが、初めての人には少し複雑です…。「 Matplotlibでアニメーションを描きたいけど、何から始めればいいの?」という方のために、 Matplotlibでアニメーションを超簡単に作成・保存する方法、アニメーション作成用の超基本テンプレを画像・サンプルコード付きで紹介していきます!
www.yutaka-note.com/entry/matplotlib_artist_anim
 

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
 

【入門編】FuncAnimationでアニメーション作成

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

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

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

from matplotlib.animation import FuncAnimation
anim = FuncAnimation(fig, update)

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

引数名 解説
fig アニメーションを描くfigure
update アニメーション更新用関数

FuncAnimationでは、update()関数の作成がポイントになります。

update()関数は、一度実行するとアニメーションが1フレーム進むような関数として定義します。

下図のようにupdate()をもとにanimオブジェクトを作成して、アニメーション化します。

FuncAnimationの基本形

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

  1. 必要なモジュールの読み込み
  2. グラフ領域の作成 ⇒ fig, axの準備
  3. グラフの初期設定 ⇒ アニメーション化するグラフ要素の用意など
  4. 更新用関数update()の作成
  5. アニメーション化 ⇒ FuncAnimationインスタンス作成

簡単なアニメーションを例に、手順を見ていきましょう。

# 1.グラフ領域の作成
%matplotlib notebook
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation
 
# 2.グラフ領域の作成
fig, ax = plt.subplots()
 
# 3. グラフの初期設定
my_line, = ax.plot([], [])
 
r = 1
ax.set_xlim(-r, r)
ax.set_ylim(-r, r)
ax.set_aspect('equal') # グラフのアスペクト比を1:1に設定
 
# 4. グラフ更新用関数の作成
def update(i):
    theta =np.deg2rad(i)
    x = [0, r*np.cos(theta)]
    y = [0, r*np.sin(theta)]
 
    my_line.set_data(x,y)
    
# 5. アニメーション化
anim = FuncAnimation(fig, update)
plt.show()

これを実行すると次のようなアニメーションが出力されます。

ポイントは、

  • 3. グラフの初期設定 ⇒ アニメーション化するグラフ要素の用意など
  • 4. グラフ更新用関数updateの作成

です。

これらを詳しく見ていきましょう。

グラフの初期設定

グラフの初期設定では、

  • アニメーション化するグラフ要素のオブジェクト作成
  • 軸目盛等の設定

を行います。

作成したグラフ要素のオブジェクトは、グラフ更新関数update()内で使用します。

my_line, = ax.plot([], [])

また、軸目盛等も初期設定時に、確定させます。

r = 1
ax.set_xlim(-r, r)
ax.set_ylim(-r, r)
ax.set_aspect('equal') # グラフの縦横比を1:1に設定

アニメーション実行時、軸目盛等は自動で調整されないので、初期設定で済ませておく必要があります。

軸周りの設定は、次の記事で解説しています。詳しく知りたい方はチェックしてください。

≫Matplotlib 軸周り完璧マスターガイド | 軸・軸目盛・目盛り線の設定
≫Matplotlib 軸周り完璧マスターガイド | 軸・軸目盛・目盛り線の設定
Matplotlibで大変なのが軸周りの設定!グラフの「この要素」を変更するには、「どのメソッド」を使えばいいのかわからない…。という方のために、Matplotlibの軸・目盛り・目盛り線の設定について総まとめしました!これで軸周りの設定がだいぶ楽になります。軸周り完ぺきマスターガイド!
www.yutaka-note.com/entry/matplotlib_axis
 

グラフ更新用関数の作成

グラフ更新用関数の基本形は次の通りです。

def update(frame):
    # 更新内容
    # グラフの更新やテキストの更新など

frameの内容は、FuncAnimationのオプショナル引数で設定できます。

デフォルトのframeの内容は、

  • 1フレームごとに1ずつ増える整数
    • 1フレーム目:frame = 0
    • 2フレーム目:frame = 1
    • nフレーム目:frame = n-1
    • (上限はなく、強制終了するまで無限に増える)

となっています。

frameの値が1ずつ増加することを利用して、グラフを更新する関数を作成します。

例では、1フレームごとに1°ずつ円周上の点を移動させています。

frameの名前は自由に変更OKです。ここでは、iとしています。

def update(i):
    theta =np.deg2rad(i)
    x = [0, r*np.cos(theta)]
    y = [0, r*np.sin(theta)]
 
    my_line.set_data(x,y)

このとき、プロットのデータの更新は、my_line.set_data(x,y)を使用しています。

グラフ要素の.set_XXX()を適切に利用することが、FuncAnimationのポイントです。

【応用編】色を変更するアニメーション

ax.plot()で作成したオブジェクトの使用頻度が高そうなメソッドを紹介します。

メソッド 内容
.set_data(x, y) データをx, yに変更
.set_color(color) グラフの色をcolorに変更
(線とプロット両方)
.set_markeredgecolor(color) プロット周囲の色をcolorに変更
.set_markerfacecolor(color) プロット内部の色をcolorに変更

アニメーションでは色を変更させることが多いので、カラーマップを使用した色の変更例を紹介します。

# 3. 初期プロットの作成
my_line, = ax.plot([], [],color="gray", linestyle="--", linewidth=1, marker="o", markeredgecolor="None")
 
r = 1
ax.set_xlim(-r, r)
ax.set_ylim(-r, r)
ax.set_aspect('equal') # グラフのアスペクト比を1:1に設定
 
cm = plt.get_cmap("winter")
 
# 3. グラフ更新用関数
def update(i):
    theta = np.deg2rad(i)
    x = [0, r*np.cos(theta)]
    y = [0, r*np.sin(theta)]
 
    my_line.set_data(x,y)
    my_line.set_markerfacecolor(cm(i%360/360))
 
# 4. アニメーション化
anim = FuncAnimation(fig, update, frames=360, interval=10)
plt.show()

次のような動画が出力されます。

ポイントとなるのは以下の2行です。

  • カラーマップの準備:cm = plt.get_cmap("winter")
  • 色の設定:my_line.set_markerfacecolor(cm(i%360/360))

更新用関数update()の中で、iに応じてカラーマップの値を設定するようにしています。

カラーマップを含めた色の詳細については、こちらの記事を参考にしてください。

≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
伝わるグラフを作るためのポイントはなんでしょうか?いかに視覚的にわかりやすいか、これが大切です。それには重要な要素に色をつけて、視覚的にうったえることが超大切!この記事では、matplotlibでの色の指定方法について、基本から応用まで徹底解説!
www.yutaka-note.com/entry/matplotlib_color
 

【応用編】テキスト/タイトルを変更するアニメーション

ax.text()でテキストオブジェクトを準備すれば、アニメーションに内にテキストを含めることも可能です。

  • my_text = ax.text(x, y, s)

textオブジェクトを作成して、.set_XXX()で座標や内容を更新します。

メソッド 内容
.set_x(x) テキストのx座標設定
.set_y(y) テキストのy座標設定
.set_text(s) 表示する文字列をsに設定

グラフのタイトルは、ax.set_title()を使用すると便利です。

  • my_text = ax.set_title(s)

内容の更新は、テキスト同様に.set_text(s)です。

以下で、テキストとタイトルを変更するアニメーション例を紹介します。

# 3. 初期プロットの作成)
my_line, = ax.plot([], [],color="gray", linestyle="--", linewidth=1, marker="o", markeredgecolor="None")
 
r = 1
ax.set_xlim(-r, r)
ax.set_ylim(-r, r)
ax.set_aspect('equal') # グラフのアスペクト比を1:1に設定
 
my_title = ax.set_title("")
my_text = ax.text(r, 0, "")
 
# 4. グラフ更新用関数
def update(i):
    theta = np.deg2rad(i)
    x = [0, r*np.cos(theta)]
    y = [0, r*np.sin(theta)]
 
    my_line.set_data(x,y)
    
    my_title.set_text(f"Plot@ i={i}")
    
    my_text.set_x(x[1])
    my_text.set_y(y[1])
    my_text.set_text(f"theta={i%360}°")
    
# 5. アニメーション化
anim = FuncAnimation(fig, update, interval=10)
plt.show()

次のような動画が出力されます。

アニメーションの保存方法

保存には、作成した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の方が簡単に設定できます。

Matplotlibのアニメーションまとめ

FuncAnimationクラスで、アニメーションを作成する方法を紹介しました。

  • 事前にグラフ更新用関数(update())を作成
  • 関数を実行しながらアニメーションにする

というところがポイントです!

Matplotlibのもう一つのアニメーション方法ArtistAnimationクラスでは、次のように設定を行います。

  • 事前にグラフ要素を複数作成
  • それらを組み合わせてアニメーションにする

FuncAnimationに比べて、設定が単純なので、ちょっとしたアニメーションを作成するときには、こちらを使用することも検討してみましょう。

詳細はこちらの記事で解説しています。

≫Matplotlib アニメーション作成入門編 |ArtistAnimation徹底解説!
≫Matplotlib アニメーション作成入門編 |ArtistAnimation徹底解説!
Matplotlibではアニメーションも作成できますが、初めての人には少し複雑です…。「 Matplotlibでアニメーションを描きたいけど、何から始めればいいの?」という方のために、 Matplotlibでアニメーションを超簡単に作成・保存する方法、アニメーション作成用の超基本テンプレを画像・サンプルコード付きで紹介していきます!
www.yutaka-note.com/entry/matplotlib_artist_anim
 

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に関する情報を発信しています。

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