matplotlibでアニメーション

にほんブログ村 その他趣味ブログ 電子工作へにほんブログ村 バイクブログ バイクライフへにほんブログ村 科学ブログ 科学ライフへブログランキング・にほんブログ村へ

matplotlibのアニメーション機能の備忘録です。
matplotlib のアニメーションは ArtistAnimation と FuncAnimation の2種類があ利ます。ArtistAnimation は、あらかじめ全てのグラフを配列の形で用意しておき、それを1枚ずつ表示するものです。FuncAnimation は予め完成したグラフを渡すのではなく、アニメーションの1フレームごとに関数を実行する。データが巨大すぎる場合や、アニメーションが無限に続く場合に利用します。

ArtistAnimation

全てのグラフを配列の形で用意し、それを1枚ずつ表示するイメージです。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure()

ims = []

for i in range(10):
        
        j = np.arange(0, 2*np.pi*(i+1)/10, 0.01)
        x = np.sin(3*j)
        y = 2*np.sin(4*j)                  
        im = plt.plot(x,y)             
        ims.append(im)                  

# 10枚のプロットを 300ms ごとに表示
ani = animation.ArtistAnimation(fig, ims, interval=300)
plt.show()
#ani.save("output01.gif", writer="imagemagick")

動画をGIFで保存する際は、末尾の

plt.show()

をコメントアウトして

ani.save("output.gif", writer="imagemagick")

に変更するとGIFファイルに保存出来ます。この時、imagemagick というパッケージが必要になります。インストールは

https://fukatsu.tech/install-imagemagick

を参考にしました。

FuncAnimation

こちらは予め完成したグラフを渡すのではなく、アニメーションの1フレームごとに関数を実行する。データが巨大すぎる場合やアニメーションが無限に続く場合に利用します。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure()

frame_no=0

def plot(data):
    global frame_no
    frame_no = frame_no + 1
    plt.cla()                      # 現在描写されているグラフを消去
    j = np.arange(0, 2*np.pi*frame_no/10, 0.01)
    x = np.sin(j)
    y = 2*np.sin(2*j)
    im = plt.plot(x,y)            # グラフを生成

ani = animation.FuncAnimation(fig, plot, interval=300,frames=30)
#ani.save("/Users/tanabemasayuki/Desktop/いろいろ/output02.gif", writer="imagemagick")
plt.show()

こちらは動的にグラフを作るため、定義域と値域が関数の値によって変化します。
GIFに出力する場合、ArtistAnimation と違って終わりが指定されていないので、

ani = animation.FuncAnimation(fig, plot, interval=300,frames=30)
ani.save("output02.gif", writer="imagemagick")

という具合に frames=30 とフレーム数を指定します。


チョットおしゃれなリサージュ図形
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure()

frame_no=0

def plot(data):
    global frame_no
    frame_no = frame_no + 1
    plt.cla()                      # 現在描写されているグラフを消去
    j = np.arange(0, 2*np.pi*frame_no/20, 0.01)
    x = np.sin(5*j)
    y = 2*np.sin(6*j)
    im = plt.plot(x,y)            # グラフを生成

ani = animation.FuncAnimation(fig, plot, interval=300,frames=30)
#ani.save("/Users/tanabemasayuki/Desktop/いろいろ/output03.gif", writer="imagemagick")
plt.show()

にほんブログ村 その他趣味ブログ 電子工作へにほんブログ村 バイクブログ バイクライフへにほんブログ村 科学ブログ 科学ライフへブログランキング・にほんブログ村へ

コメントを残す

メールアドレスが公開されることはありません。