内容
- matplotlib チャートをリアルタイム更新する方法
- matplotlib チャートをアニメーション表示し GIFファイルに保存する方法
PIL(Python Imaging Library)を使います。matplotlib.ArtistAnimation は使いません。 Colab で動作確認しました。
matplotlib チャートをリアルタイム更新
IPython.display を使います。早すぎると表示にコマ落ちが発生します。リピート再生はできません。
import time
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import display # 試した環境では省略しても動作しました
x = np.linspace(0, 2 * np.pi, 24)
fig = plt.figure(figsize=(2, 1.5))
display_handle = display(fig, display_id=True)
for i in range(12):
y = np.sin(x + 0.5 * i)
plt.clf() # Axes の場合は ax.cla()
plt.plot(x, y, '-')
display_handle.update(fig)
time.sleep(0.5)
plt.close()
matplotlib チャートをアニメーション表示し GIFファイルに保存
matplotlibチャートをコマ画像としてメモリ上に蓄積し最後に PIL でGIF画像に変換します。そのGIF画像を IPython.display で表示します。
import io
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
from IPython.display import display # 試した環境では省略しても動作しました
from IPython.display import Image as DisplayImage
def fig2im(fig):
"""PyPlotのFIgureをPIL画像に変換"""
with io.BytesIO() as fp:
fig.savefig(fp, bbox_inches='tight', format='png')
im = Image.open(fp)
im.load()
return im
def draw_animation(imgs):
"""PIL画像リスト imgs をアニメーションGIFで表示"""
with io.BytesIO() as fp:
# 先頭のPIL画像に後続するPIL画像を追加しGIF画像として保存
imgs[0].save(fp, format='gif', append_images=imgs[1:], save_all=True, loop=0, duration=120)
# ファイルの先頭へ移動
fp.seek(0)
# GIF画像表示
display(DisplayImage(data=fp.read(), format='gif'))
return
# アニメーションのコマ画像を作成
imgs = []
x = np.linspace(0, 2 * np.pi, 24)
fig = plt.figure(figsize=(2, 1.5))
for i in range(12):
y = np.sin(x + 0.5 * i)
plt.clf() # Axes の場合は ax.cla()
plt.plot(x, y, '-')
imgs.append(fig2im(fig))
plt.close()
# アニメーション表示
draw_animation(imgs)
表示されたアニメーション上で[右クリック]-[名前を付けて画像を保存] でGIFファイルとして保存できます。