matplotlib ライブラリ

【python】matplotlibのグラフからgifを作成する方法

pythonのグラフ描画用ライブラリである「matplotlib」でgif形式のファイルを作成する方法について紹介します。

本記事では、下記の内容を紹介します。

この記事で分かること

  • matplotlibでグラフの画像を複数枚保存し、後処理でgifを作成する方法
  • matplotlib.animationを用いて、gifを作成する方法

スポンサーリンク

matplotlibでグラフの画像を複数枚保存し、後処理でgifを作成する方法

はじめに、matplotlibでグラフの画像を複数枚保存し、後処理でgifを作成する方法について紹介します。

こちらの方法は、ネット上のgif作成サービスなどを利用してgifを作成する必要があるため、ひと手間多くかかります。

簡単にgifを作成したい方は、次の「matplotlib.animationを用いてgifを作成する方法」まで飛ばしてください。

以下、matplotlibでグラフの画像を複数枚保存するサンプルコードです。

### matplotlibでグラフの画像を複数枚保存
import matplotlib.pyplot as plt
import numpy as np
import pathlib


# グラフの画像を出力するディレクトリ
path_dir = pathlib.Path(r'test')

#グラフを表示する領域を,figオブジェクトとして作成.
fig = plt.figure(figsize = (5,5), facecolor='lightblue')

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

for i, delta in enumerate(np.linspace(0, np.pi * 2, 30)):
    plt.cla()
    y = np.sin(x + delta)
    plt.plot(x, y, color='blue')

    plt.legend(['sin'], loc='upper right')
    
    s_img = str(i)
    name_img = s_img.zfill(3)+'.jpg'
    path_img = path_dir.joinpath(name_img)

    fig.savefig(path_img)

コードを実行すると、指定したディレクトリに30枚の画像が保存されます。

30枚の画像から、ネット上のgif作成サービスを使用して作成したgifファイルがこちらになります。

作成したgif

> path_dir = pathlib.Path(r'test')

pathlibモジュールで、グラフの画像の保存先のディレクトリのpathオブジェクトを生成しています。
pathlibモジュールの使い方については、下記の記事で詳しく紹介しています。

pathlibモジュールの使い方

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

0 ~ 4πまでの x の要素を作成し、リストにしています。

> for i, delta in enumerate(np.linspace(0, np.pi * 2, 30)):

np.linspace(0, np.pi * 2, 30) で、0 ~ 2πまでの要素を作成しています。
作成した要素をenumerate関数を用いて、インデックスとともに1つずつ取り出しています。

enumerate関数の使い方については、下記の記事で紹介しています。

enumerate関数の使い方

> plt.cla( )

プロットをクリアしています。これを入れないと、前のグラフの上に新たなグラフが重ね書きされます。

> plt.legend(['sin'], loc='upper right')

凡例を表示しています。
凡例の表示方法については、下記の記事で詳しく紹介しています。

matplotlibで凡例を表示する方法

> s_img = str(i)
> name_img = s_img.zfill(3)+'.jpg'
> path_img = path_dir.joinpath(name_img)

enumerate関数で取り出したインデックスから、連番のファイル名を生成しています。
文字列のzfillメソッドで、ゼロ埋めした3桁の数値の文字列に変形しています。
3桁の連番の文字列は、pathオブジェクトのjoinpathでディレクトリのパスと連結され、ファイルパスになります。

コードを実行すると、30枚の画像が指定したディレクトリに保存されます。
作成された画像から、ネット上のgif作成サービスを使用して、gifを作成します。

今回は、こちらのサイトを使用させていただきました。

スポンサーリンク

matplotlib.animationを用いて、gifを作成する方法

次に、matplotlib.animationを用いて、グラフのアニメーションをgif形式で保存する方法について、紹介します。

直接gif形式で保存できるため、画像を自分でgif化する手間がかからず、簡単にgifファイルを作成することができます。

matplotlibでアニメーションを作成する方法として、ArtistAnimationを用いる方法と、FuncAnimationを用いる方法の2通りの方法があります。

ArtistAnimationは、アニメーション化するグラフをあらかじめリストの形で用意しておき、それを順番に表示します。

FuncAnimationは、あらかじめグラフを用意するのではなく、アニメーションの1フレームごとに関数を実行し、関数の実行結果を順番に表示します。

とっつきやすいのはArtistAnimationの方ですが、あらかじめアニメーション化するグラフを作成しリストとして保持しないといけないため、重くなるという欠点があります。

ArtistAnimationと、FuncAnimation、それぞれでアニメーションを作成しgif形式で保存する方法を、順番に紹介します。

ArtistAnimationでgifを作成する方法

matplotlibのArtistAnimationで作成したアニメーションをgif形式で保存する方法について紹介します。

matplotlib.animation.ArtistAnimation の引数の指定方法について、 公式ドキュメント から引用しました。

公式ドキュメント

figに、グラフ描画領域のfigオブジェクトを渡します。

artistsには、アニメーション化するグラフのリストを渡します。

以下、ArtistAnimationで作成したアニメーションをgif形式で保存するサンプルコードです。

### matplotlibで作成したアニメーションをgif形式で保存
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
import numpy as np
import pathlib

#グラフを表示する領域を,figオブジェクトとして作成.
fig = plt.figure(figsize = (5,5), facecolor='lightblue')

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

frames = []
for i in np.linspace(0, np.pi * 2, 30):

    y = np.sin(x + i)
    frame = plt.plot(x, y, color='blue')
    frames.append(frame)
    

plt.legend(['sin'], loc='upper right')
ani = ArtistAnimation(fig, frames, interval=100)

# pathlibモジュールでパスを作成する
path_dir = pathlib.Path(r'test')
path_gif = path_dir.joinpath('animation.gif')

ani.save(path_gif, writer='pillow')
plt.close()

コード実行後、保存されるgifファイルはこちらになります。

matplotlibで作成したアニメーション
matplotlibで作成したアニメーション

> %matplotlib notebook

筆者環境は jupyter notebook であるため、この一行を記述しています。
これを記述することで、matplotlibのグラフをインタラクティブモードで出力することができます。
とりあえず、jupyter notebookでアニメーションを表示する際に必要と覚えておいてください。

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

0から4πまでの、2周期分の x の要素を作成しています。

> for i in np.linspace(0, np.pi * 2, 30):

0から2πまでの要素を30個作成し、順番に i に渡してループさせます。

> y = np.sin(x + i)
> frame = plt.plot(x, y, color='blue')
> frames.append(frame)

sinの値を更新しつつグラフを作成し、リストに追加しています。

> ani = ArtistAnimation(fig, frames, interval=100)

ArtistAnimationで、アニメーションを作成しています。
intervalの単位はミリ秒です。

> ani.save(path_gif, writer='pillow')

ArtistAnimationの、saveメソッドでアニメーションをgif形式で保存しています。

FuncAnimationでgifを作成する方法

matplotlibのFuncAnimationで作成したアニメーションをgif形式で保存する方法について紹介します。

matplotlib.animation.FuncAnimation の引数の指定方法について、 公式ドキュメント から引用しました。

公式ドキュメント

funcに、グラフを描画する関数を指定する必要があります。

以下、FuncAnimationで作成したアニメーションをgif形式で保存するサンプルコードです。

### matplotlibで作成したアニメーションをgif形式で保存
%matplotlib notebook
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation


def plot_hist(data):
    plt.cla()
    # 平均0、標準偏差10、の正規分布の乱数を1,000個生成
    x = np.random.normal(0, 10, 1000)
    frame = plt.hist(x,  bins=20, range=(-50, 50), density=True, ec='black')     
        

#グラフを表示する領域を,figオブジェクトとして作成.
fig = plt.figure(figsize = (5,5), facecolor='lightblue')
 

ani = FuncAnimation(fig, plot_hist, interval=100, frames=10)

# pathlibモジュールでパスを作成する
path_dir = pathlib.Path(r'test')
path_gif = path_dir.joinpath('animation-hist.gif')

ani.save(path_gif, writer='pillow')
plt.close()

コード実行後、保存されるgifファイルはこちらになります。

実行結果

> def plot_hist(data):

正規分布に従った乱数を生成し、ヒストグラムを描画する関数を定義しています。

> ani = FuncAnimation(fig, plot_hist, interval=100)

FuncAnimationの引数に、ヒストグラムを描画する関数である「plot_hist」を指定しています。

> ani.save(path_gif, writer='pillow')

FuncAnimationの、saveメソッドでアニメーションをgif形式で保存しています。

スポンサーリンク

-matplotlib, ライブラリ
-,