matplotlibのアニメーションの使い方|sin派の動画を作るのを例に解説する

スポンサーリンク

今まで、基本的な matplotlib のプロットを見てきたと思いますが、同じ matplotlib モジュールを使って、アニメーションのプロットも作ることができます! それでは、同じものを作る方法を見てみましょう。

スポンサーリンク

必要なモジュールのインポート

1
2
3
4
5
6
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random
from itertools import count
from IPython import display

各モジュールとその要件は下表のとおりです。

モジュール名|要件|Numpyモジュール
Numpyモジュール|プロットのためのデータセットを作成するために使用します。
matplotlibモジュール:必要なプロットを行う。
matplotlib.animation|アニメーションプロットのための機能性を提供します。
random|ランダムな間隔のランダムなポイントを生成します。
countモジュール|連続した数値のシリーズを生成します。
displayモジュール: アニメーションプロットの動画を表示するモジュール

Name and Requirement of various modules## Creating a dataset for the animated plots in Python

データセットを作成するために、xyという2つのリストを作成します。

xにはx座標が、yにはy座標が格納されます。

x座標は連続した数字です。

cound モジュールを使って、 count 関数でカウントイテレータを作成し、 0 から始まる数値を数えることにします。

また、次の数字にアクセスするために next 関数を使用します。

y座標については、2つの整数の間で任意の乱数を選ぶために random モジュールを使用する予定です。

以下のコードでは、値のインクリメントを行う animate 関数を含めて実装しています。

1
2
3
4
5
6
7
x=[]
y=[]
i = count()
def animate(j):
    x.append(next(i))
    y.append(random.randint(0, 10))
    plt.plot(x,y)

アニメーションオブジェクトの作成

次のステップでは、animation_1 という名前のオブジェクトを作成します。

animate関数を実装するために、FuncAnimation` を使用します。

この関数には、以下のようないくつかのパラメータがあります。

  1. plt.gcf() : 1. plt.gcf() : 次のパラメータで示される関数を ‘current function’ として受け取る。
    1. 関数名: この場合 animate です。
      3.インターバル。関数が繰り返される時間を設定します。
animation_1 = animation.FuncAnimation(plt.gcf(),animate,interval=1000)
plt.show()

python IDLEを使用している場合、プロットは自動的に生成されます。

しかし、jupyter notebookを使用している場合、コードの後にplt.show()` 関数を使用しても、出力として何も印刷されません。

これを避けるためには、次のセクションで述べるように、HTML形式で形成されたビデオを変換する必要があります。

アニメーションプロットを HTML 動画に変換する (Jupyter Notebook ユーザ向け)

まず、作成されたアニメーションをhtml5ビデオに変換する必要があります。

これは、以下のコードの行番号 1 で行われます。

行番号 2 では、html5 ビデオを表示するための HTML コードを作成しています。

最後に 3 行目で、ビデオを表示するために生成した html コードを表示します。

1
2
3
4
5
video_1 = animation_1.to_html5_video()
html_code_1 = display.HTML(video_1)
display.display(html_code_1)
plt.tight_layout()
plt.show()

この後、行番号 45 では、単純にポイントをプロットすることができます

このコードの出力は以下のようなものになります。

ポイントはランダムに生成されるので、あなたのプロットは私のものとは異なるかもしれません。

下の図は、ある時点の最終的なプロットを示しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
x1=[]
y1=[]
i1 = count()
def animate1(j):
    t=next(i1)
    x1.append(2*t)
    y1.append(np.sin(t))
    plt.cla()
    plt.plot(x1,y1)
animation_2 = animation.FuncAnimation(plt.gcf(),animate1,interval=50)
video_2 = animation_2.to_html5_video()
html_code_2 = display.HTML(video_2)
display.display(html_code_2)
plt.tight_layout()
plt.show()

sin 波のアニメーションをプロットする

以下のコードを使って、きれいな正弦波をプロットすることができます

いくつかの変更点は以下の通りです。

  1. より良いプロットのために、生成されたカウント値の2倍をx座標として使用します。
    1. アニメーション関数の間隔を狭めて、より明確に可視化します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
plt.style.use('dark_background')
x=[]
y_sin=[]
y_cos=[]
i_n = count()
def animate_n(j):
    t=2*next(i)
    x.append(t)
    y_sin.append(np.sin(t))
    y_cos.append(np.cos(t))
    plt.cla()
    plt.plot(x,y_sin,label="Sine wave",color="red")
    plt.plot(x,y_cos,label="Cosine wave",color="green")
animation_n = animation.FuncAnimation(plt.gcf(),animate_n,interval=500)
video_n = animation_n.to_html5_video()
html_code_n = display.HTML(video_n)
display.display(html_code_n)
plt.tight_layout()
plt.show()

出力されたアニメーションプロットと一定時間経過後のスタティックプロットを以下に示す。

正弦波を表示した動画

サインとコサインの両方を同じアニメーションにプロットする

以下のコードを見て、同じアニメーション上に両方の曲線を表示してみましょう。

正弦曲線と余弦曲線にそれぞれ別の y 値をとり、同じアニメーション上に両者をプロットしています。

また、’dark_background’を使用することで、少しスパイスを加えています。

Python animated plots
x_vs_y_animated_plot

下のアニメーションは上記のコードの結果です。

まとめ

今日、あなたは matplotlib モジュールを使ってアニメーションプロットを作成する方法を学びました。

自分でコーディングすることを楽しめたなら幸いです。

読んでくださってありがとうございます。

タイトルとURLをコピーしました