Pynote

Python、機械学習、画像処理について

matplotlib - アニメーションするグラフを作成する

各フレームを予め作成する。

animation.ArtistAnimation

アニメーションを作成するには、animation.ArtistAnimation を使用する。

animation.ArtistAnimation(fig, artists, *args, **kwargs)
  • 引数
    • fig: Figure オブジェクト
    • artists: 各フレームを構成する Artist の一覧
    • interval: 各フレームのインターバルを ms で指定する。デフォルトは 200 ms。
    • repeat_delay: リピートする場合、リピートする前の遅延を ms で指定する。デフォルトは None。
    • repeat: リピートするかどうか。デフォルトは True。
    • bilit: blitting を使用して描画を高速化するかどうか。デフォルトは False。

サンプル

1. artists 引数に渡すための [[フレーム1を構成する Artist 一覧], ...] を作成する。
2. ArtistAnimation オブジェクトを作成する。
3. gif 画像で保存する。

Axes.plot() は返り値として、[lines.Line2D] を返す。これが1フレームを構成する Artist である。


各フレームで表示する Artist は折れ線1つだけなので、以下のようになる。

artists = [[lines.Line2D],
           [lines.Line2D],
           ...]
%matplotlib nbagg  # Notebook で inline 表示する

#import packages
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import ArtistAnimation

x = np.linspace(0, np.pi * 4, 100)

fig, axes = plt.subplots(figsize=(4, 4))
frames = []  # 各フレームを構成する Artist 一覧
for delta in np.linspace(0, np.pi, 30):
    y = np.sin(x + delta)
    
    # 折れ線グラフを作成する。
    artists = axes.plot(x, y, c='b')
    frames.append(artists)

# アニメーションを作成する。
anim = ArtistAnimation(fig, frames, interval=500)

# gif 画像として保存する。
anim.save('animation.gif', writer='imagemagick')

# Figure を表示する。
fig.show()

imagemagick が無くて保存に失敗する場合は、インストールする。

sudo apt-get -y install imagemagick

複数の Axes がある場合

各フレームで表示する Artist は折れ線2つなので、以下のようになる。

artists = [[lines.Line2D, lines.Line2D],
           [lines.Line2D, lines.Line2D],
           ...]
%matplotlib nbagg

#import packages
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import ArtistAnimation

x = np.linspace(0, np.pi * 4, 100)

fig, [axes1, axes2] = plt.subplots(1, 2, figsize=(8, 4))
frames = []  # 各フレームを構成する Artist 一覧
for delta in np.linspace(0, np.pi, 30):
    y1 = np.sin(x + delta)
    y2 = np.cos(x + delta)

    artists1 = axes1.plot(x, y1, c='b')
    artists2 = axes2.plot(x, y2, c='g')
    # このフレームを構成する Artist 一覧を1つにまとめる。
    frame = artists1 + artists2

    frames.append(frame)

# アニメーションを作成する。
anim = ArtistAnimation(fig, frames, interval=500)
anim.save('animation.gif', writer='imagemagick')

# Figure を表示する。
fig.show()


オンラインでフレームを生成する。

animation.ArtistAnimation

アニメーションを作成するには、animation.FuncAnimation を使用する。

animation.FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, **kwargs)
  • 引数
    • fig: Figure オブジェクト
    • func: 各フレームを生成する関数
    • frames: 各フレームのデータ
    • init_func: 各フレームを初期化する関数
    • fargs: func に渡す引数。
    • save_count: キャッシュするフレーム数
    • interval: 各フレームのインターバルを ms で指定する。デフォルトは 200 ms。
    • repeat_delay: リピートする場合、リピートする前の遅延を ms で指定する。デフォルトは None。
    • repeat: リピートするかどうか。デフォルトは True。
    • bilit: blitting を使用して描画を高速化するかどうか。デフォルトは False。

サンプル

%matplotlib nbagg

#import packages
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation

fig = plt.figure(figsize=(4, 3))

def plot(data):
    plt.cla()
    x = np.linspace(0, np.pi * 4, 100)
    y = np.sin(x + data)
    plt.plot(x, y, c='b')

# アニメーションを作成する。
anim = FuncAnimation(fig, plot, frames=100)
anim.save('animation.gif', writer='imagemagick')

# Figure を表示する。
fig.show()