Phython

【matplotlib】様々なグラフのアニメーションを作成する方法|GoogleColab使用

pythonを使ってグラフは書けるようになったけれど、グラフを動かしてみたい!

今回の記事では、グラフのアニメーション機能というものを使ってこのような要望にお応えしていきます。

また、アニメーションを保存する方法までご紹介していこうと思います。

初心者の方でもわかりやすいように丁寧に説明しているので、ぜひ最後まで見ていってください。

この記事でわかること

  • matplotlibを用いたアニメーションの作成方法
  • 作成したアニメーションの保存方法

 アニメーション作成の準備

まずアニメーションを実際に作っていく前に、下準備の方を行っていきましょう。

アニメーション作成の仕組み

アニメーションを作成する前に少しアニメーション作成の仕組みについてご紹介していこうと思います。

まず、アニメーションを作成するためには、アニメーション作成用のモジュールを用意しなければなりません。
ちなみに、アニメーション作成に用いられるモジュールは二つあるのでそれぞれについて軽く紹介していきたいと思います。

  • ArtistAnimation
  • FuncAnimation

①:ArtistAnimation

こちらは、グラフの情報をノートのようなものにまとめて、パラパラ漫画のごとくグラフの情報を瞬時に切り替えることによってアニメーションを作成するといったモジュールになっています。

FuncAnimationと比べて、ファイルのサイズは大きく、処理速度は遅いといったデメリットがありますが、実装方法は比較的簡単なので、単純なグラフのアニメーションを作成する際に使用するモジュールとなっています。

初めてグラフのアニメーションを作成する方や、そこまで複雑なアニメーション作成を求めていない方はこちらでよいと思います。

ちなみに、本記事ではこちらを使用してアニメーションを作成しています。

②:FuncAnimation

こちらは、事前にグラフ更新用の関数というものを用意して、関数を実行しながらアニメーションを作成するといったモジュールになっています。ArtistAnimationとは比べると、最初にすべての関数を用意しておかないといった特徴があります。

また、ファイルのサイズは小さく、処理速度が速いといったメリットはありますが、実装方法が比較的複雑なので、高度なアニメーションを作成したいという時に使用するモジュールになっています。

今回は、ArtistAnimationを使用したアニメーション作成を行う予定ですので、FuncAnimationの方は紹介程度に留めておきます。

必要なライブラリのインポート

では、今回のプログラムに必要なライブラリをインポートしていきましょう。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
from matplotlib import animation, rc

今回使用するライブラリは上記の通りです。
ちなみに、下2行はアニメーションに関するものになっています。

ここで、numpy・matplotlibって何?という方は、以下の記事から先に読むことをおすすめします。
ぜひ理解に役立ててみてください。

これで今回行う下準備は終了です。

それでは、さっそくアニメーション作成の方に移っていきましょう。

 アニメーション作成

では、ここからは実際にコードを用いてアニメーションを作成していきます。
皆さんもよろしければ、手を動かして一緒に動作させてみましょう。

基本的なアニメーション作成

まずは、簡単なアニメーションを作っていきます。

<input>

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
from matplotlib import animation, rc

fig = plt.figure(figsize=(5,4)) #グラフを張り付ける図を作成

x = np.linspace(0, 4*np.pi, 300) #0から4πまでの数値を等間隔で刻んで100個、xに代入

frames = [] #グラフの情報を入れるための空の配列を用意
for i in np.linspace(0, 2*np.pi, 100): 
  y = np.sin(x + i)
  frame = plt.plot(x, y, color = 'blue') #frameにグラフの情報を代入
  frames.append(frame) #frameの内容をframesという名前の配列に追加

ani = ArtistAnimation(fig, frames, interval=100) #作成した配列のリストを用いてアニメーション作成
rc("animation", html="jshtml") #アニメーションを作る際のおまじない
plt.close() #pltの座標平面は必要ないので削除
ani #アニメーション表示

<output>

コードの説明としては、基本的にプログラム内に書いてあるコメントを読んでいただければよいと思います。

先ほどお話ししたように、今回のアニメーションではArtistAnimationを使用しているので、あらかじめ複数のグラフ(frame)を用意して、その複数のグラフの情報を一枚のノート(frames)にまとめることでペラペラ漫画のように動画を作成しているといった形になっています。

また、いくつかあまり見ない関数があると思うので、それに関しては以下の表にまとめてあります。
参考にしてください。

関数説明
append()指定の配列に要素を追加する関数。
ArtistAnimation(x,y,interval)xにはグラフを張り付ける図の情報が、yには動画を作成するうえで必要なグラフの情報の集合が入る。
また、intervalに設定されている値は次のグラフを表示させるのにかける時間でこれが短いほど滑らかなグラフが作成できる。ちなみに単位はミリ秒。
rc()Google Colaboratoryでアニメーションを作る際のおまじないだと思ってもらえれば大丈夫です。

複数のアニメーションを一つにまとめて作成

続いては複数のアニメーションを、一つの図に表示する方法についてご紹介していきます。

<input>

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
from matplotlib import animation, rc

fig = plt.figure(figsize=(5,4)) #グラフを張り付ける図を作成

x = np.linspace(0, 4*np.pi, 300) #0から4πまでの数値を等間隔で刻んで100個、xに代入

frames = [] #グラフの情報を入れるための空の配列を用意
for i in np.linspace(0, 2*np.pi, 100): 
  y1 = np.sin(x + i)
  y2 = np.cos(x + i)
  frame1 = plt.plot(x, y1, color = 'blue') #frame1にグラフの情報を代入
  frame2 = plt.plot(x, y2, color = 'green') #frame2にグラフの情報を代入
  frames.append(frame1 + frame2) #frameの内容をframesという名前の配列に追加

ani = ArtistAnimation(fig, frames, interval=100) #作成した配列のリストを用いてアニメーション作成
print(frames)
rc("animation", html="jshtml")
plt.close()
ani

<output>

今回のコードのポイントは、『frames.append(frame1 + frame2)』という部分です。
こうすることで、frame1とframe2の情報をframesに適用することができるので、二つのアニメーションを表示させることが可能になります。

複数のアニメーションを複数に分けて作成

先ほどは二つのアニメーションを同じ座標平面上に表示させたのですが、今度は異なる座標平面を用意して別の場所に作ってしまいましょう。

<input>

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
from matplotlib import animation, rc

fig = plt.figure(figsize=(5,4)) #グラフを張り付ける図を作成
ax1 = fig.add_subplot(1,2,1) #グラフを貼り付けるための位置確保
ax2 = fig.add_subplot(1,2,2) #グラフを貼り付けるための位置確保

frames = [] 
x = np.linspace(0, 4*np.pi, 300)

for i in np.linspace(0, 2*np.pi, 100): 
  y1 = np.sin(x + i)
  y2 = 2 * np.cos(x + i)
  frame1 = ax1.plot(x, y1, color = 'blue') 
  frame2 = ax2.plot(x, y2, color = 'green')
  frames.append(frame1+frame2)

ani = ArtistAnimation(fig, frames, interval=100)
rc("animation", html="jshtml")
plt.close()
ani

今回は、axesオブジェクトを用いて二つのアニメーションをfigureという図の上に貼っている状態になります。
こうすることで、3つでも4つでもアニメーションを同時に流すことが可能です。

3Dアニメーション

続いては、3D空間で動くアニメーションの作成です。
「3Dグラフの書き方がわからない」といった方は、以下の記事から先に読むことをおすすめします。

<input>

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
from matplotlib import animation, rc

fig = plt.figure(figsize=(5,4))
ax = fig.add_subplot(projection='3d') #3D空間の作成

frames = []
x = np.linspace(0, 4*np.pi, 300)

for i in np.linspace(0, 2*np.pi, 100): 
  y = np.sin(x + i)
  z = np.cos(x + i)
  frame = ax.plot(x, y, z, color = 'blue')
  frames.append(frame)

ani = ArtistAnimation(fig, frames, interval=100)
rc("animation", html="jshtml")
plt.close()
ani

<output>

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

最後に、作成したアニメーションの保存方法についてご紹介していきたいと思います。

先ほどの3Dアニメーションで使用したコードを例に取り上げて、わかりやすく説明していきます。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
from matplotlib import animation, rc

fig = plt.figure(figsize=(5,4))
ax = fig.add_subplot(projection='3d') #3D空間の作成

frames = []
x = np.linspace(0, 4*np.pi, 300)

for i in np.linspace(0, 2*np.pi, 100): 
  y = np.sin(x + i)
  z = np.cos(x + i)
  frame = ax.plot(x, y, z, color = 'blue')
  frames.append(frame)

ani = ArtistAnimation(fig, frames, interval=100)
ani.save("animation.mp4") #保存処理
rc("animation", html="jshtml")
plt.close()
ani

上記の位置に、『ani.save("保存したい動画の名前.mp4")』と記述するだけです。

保存したいアニメーションのコードにその1文を付け加えて実行してみてください。

そうすると、上の画像のように、アニメーションが表示されますよね。
恐らくコードを追加する前と一見何も変わってないように見えると思います。

ここで、画面左側にあるファイルボタンをタップしてみましょう。
そうすると、先ほど自分が設定した名前のファイルが出てくると思います。

もし、表示されない場合はファイルという文字のすぐ下にある四つのボタンのうち、左から二番目の『更新』ボタンをタップしてみましょう。

また、表示されたファイルをダブルクリックすることでダウンロードを行うこともできます。

以上でアニメーションの作成から保存方法まで一通り終了となります。
ここまでお疲れさまでした。

 まとめ

今回は、アニメーションの作成方法から保存方法までをご紹介してきましたが、アニメーションに対する理解は深まったでしょうか。

アニメーションを用いることで、本日紹介した関数だけでなく、さまざまなグラフを動かせるようになります。

ぜひ皆さんも、さらに学習を進めて、本日の内容を応用させてみてください。

-Phython
-,