PythonでGIFアニメを作る(PILでアニメーションファイルを出力編)

Pythonのmatplotlibで描いたグラフをPillowを使ってGIFアニメーション出力します。

目次

  1. グラフの遷移をアニメーションで表現する方法
  2. Pillowでのアニメーション作成例

グラフの遷移をアニメーションで表現する方法

以前の投稿でmatplotlibで描いたリサジュー図形を imagemagickを使ったり 連番ファイルを使ったり してGIFアニメーションに出力していました。

ただ、Imagemagickはバージョンによってコマンドが変わったりしますし、連番ファイルに出力するのもちょっと手間でした。

ということで、オンメモリでGIFアニメーションに出力してみます。

具体的には、matplotlibで描いたグラフをndarrayに変換して、そのndarrayをPillowのImageオブジェクトに変換して、GIFアニメーションとしてファイル出力します。matplotlibからndarrayへの変換については、 こちらの投稿 を参照してください。

また、Pillowを使わずに OpenCVでMP4に出力する方法 もありますので、参考にしてください。

Pillowでのアニメーション作成例

以前の投稿と同じリサジュー図形のアニメーションを出力します。

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

theta = np.linspace(0, 2*np.pi, 201)
delta_theta = np.linspace(0, 2*np.pi, 201)
b = 1.0
muki = True

ims=[]
for i in delta_theta:
    x = np.cos(theta)
    y1 = np.sin(theta + i)
    y2 = np.sin(b*theta)
    y3 = np.sin(2*theta + i)

    # 描画
    fig = plt.figure(figsize=(3,3))
    plt.plot(x, y1, 'b', x, y2, 'g', x, y3, 'r')
    fig.canvas.draw()

    # Imageオブジェクトへ変換
    image_array = np.array(fig.canvas.renderer.buffer_rgba())
    # image_array = np.array(fig.canvas.renderer._renderer) # matplotlibが3.1より前の場合
    im = Image.fromarray(image_array)
    ims.append(im)
    plt.close()

    if muki is True:
        b = b + 0.05
        if b > 6:
            muki = False
    else:
        b = b - 0.05

# 出力
ims[0].save('out.gif', save_all=True, append_images=ims[1:], loop=0, duration=30)

canvas.draw()で描画したグラフを、canvas.render.buffer_rgba()で取り出してndarrayにし、Image.fromarrayでImageオブジェクトにしています。このImageオブジェクトをリストにためていって、saveでアニメーション出力します。

出力はこうなります。

アニメーション出力

広告

Pythonでグラフカテゴリの投稿