JSAnimation

公式のdocument: https://matplotlib.org/api/animation_api.html

matplotlib version 2.1 から、JSAnimation は matplotlib に取り込まれた。

JSAnimation は matplotlib.pyplot で生成したplotを連続して表示することで、アニメーション表示を実現している。

%matplotlib notebook というマジックを使う。 %matplotlib inline ではないことに注意すること。

ArtistAnimation() は生成した画像の配列を渡して、まとめて表示する。 FuncAnimation() は画像を生成する度に表示を行う。

In [7]:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random

%matplotlib notebook
In [14]:
fig = plt.figure(figsize=(5,5))
images = []

for i in range(20):
    rand = np.random.randn(100) # 100個の乱数を生成する
    img = plt.plot(rand)
    plt.title("sample")
    plt.ylim(-10,10)
    images.append(img)
    
anim = animation.ArtistAnimation(fig, images, interval=100, repeat=False)
plt.show()

# to save, you have to install some additional packages
# anim.save("output.mp4", writer="something_good")
In [18]:
fig = plt.figure(figsize=(5,5))

def animate(i):
    plt.cla()
    rand = np.random.randn(100)
    img = plt.plot(rand)
    plt.title("sample")
    plt.ylim(-10,10)
    return img

anim = animation.FuncAnimation(fig, animate, interval=100, frames=20, repeat=False)
plt.show()

アニメーションを保存する

保存するアニメーションの形式によって、何をインストールしておくべきかが異なる。mp4で保存するにはどうすればよいか?

現在手元で使っているPC (msi)では、単に anim.save("aaa.mp4") として呼び出すことで、うまく保存できた。どうやら ffmpeg をインストールしておけばよさそうだ。

In [19]:
fig = plt.figure(figsize=(5,5))

def animate(i):
    plt.cla()
    rand = np.random.randn(100)
    img = plt.plot(rand)
    plt.title("sample")
    plt.ylim(-10,10)
    return img

anim = animation.FuncAnimation(fig, animate, interval=100, frames=20, repeat=False)
anim.save("saved_anim.mp4")
plt.show()
In [ ]: