pythonのmatplotlibでアニメーションを作成する方法

PythonのMatplotlibで雨粒の波紋アニメーションを作成しよう!

PythonのMatplotlibはデータの可視化だけでなく、アニメーションの作成も得意です。今回は、初めてMatplotlibを使う方でも理解しやすいように、雨粒の波紋が広がるアニメーションを作成する方法をご紹介します。

必要なライブラリをインポートしよう

最初に、必要なライブラリをインポートします。以下のコードを使ってください。

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

レインドロップのアニメーションを作成しよう

まず、新しいFigureとAxesを作成します。これによってアニメーションのキャンバスが作成されます。

fig = plt.figure(figsize=(7, 7))
ax = fig.add_axes([0, 0, 1, 1], frameon=False)
ax.set_xlim(0, 1), ax.set_xticks([])
ax.set_ylim(0, 1), ax.set_yticks([])

レインデータの作成と初期化

次に、雨粒のデータを作成し、初期化します。

n_drops = 50
rain_drops = np.zeros(n_drops, dtype=[('position', float, (2,)),
                                      ('size',     float),
                                      ('growth',   float),
                                      ('color',    float, (4,))])

rain_drops['position'] = np.random.uniform(0, 1, (n_drops, 2))
rain_drops['growth'] = np.random.uniform(50, 200, n_drops)

アニメーションの更新関数を定義しよう

アニメーションを更新するための関数を定義します。

def update(frame_number):
    current_index = frame_number % n_drops

    rain_drops['color'][:, 3] -= 1.0/len(rain_drops)
    rain_drops['color'][:, 3] = np.clip(rain_drops['color'][:, 3], 0, 1)

    rain_drops['size'] += rain_drops['growth']

    rain_drops['position'][current_index] = np.random.uniform(0, 1, 2)
    rain_drops['size'][current_index] = 5
    rain_drops['color'][current_index] = (0, 0, 0, 1)
    rain_drops['growth'][current_index] = np.random.uniform(50, 200)

アニメーションの構築

最後に、アニメーションを構築します。

animation = FuncAnimation(fig, update, interval=10, save_count=100)

#下の文のコメントアウトを外すと動画が保存されます.
#animation.save('RainSimulation.mp4', writer='ffmpeg', fps=30)

アニメーションの保存

上のコードで最終行のコメントアウトを外すと作成したアニメーションを保存することができます.
保存する際にffmpegがインストールされていないとエラーとなるので,事前にインストールしておきましょう.

コマンドラインで以下のように入力してffmpegをインストールします.

pip install ffmpeg

アニメーションを表示しよう

最後に、作成したアニメーションの実際の結果を見てみましょう。以下のコードを最後に追加して、アニメーションを表示しましょう。

以下のコードを追加することで、jupyter上でアニメーションを表示できます。

from IPython.display import HTML
HTML(animation.to_html5_video())

実際に出力したアニメーションがこちら

最後にコード全体を解説コメント付きで示します.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from IPython.display import HTML

# 乱数の再現性を確保するためのランダムシード
np.random.seed(19680801)

# 新しいFigureとAxesを作成
fig = plt.figure(figsize=(7, 7))
ax = fig.add_axes([0, 0, 1, 1], frameon=False)
ax.set_xlim(0, 1), ax.set_xticks([])
ax.set_ylim(0, 1), ax.set_yticks([])

# 雨データの生成
n_drops = 50
rain_drops = np.zeros(n_drops, dtype=[('position', float, (2,)),
                                      ('size',     float),
                                      ('growth',   float),
                                      ('color',    float, (4,))])

# 雨滴をランダムな位置と成長率で初期化
rain_drops['position'] = np.random.uniform(0, 1, (n_drops, 2))
rain_drops['growth'] = np.random.uniform(50, 200, n_drops)

# アニメーション中に更新される散布図の設定
scat = ax.scatter(rain_drops['position'][:, 0], rain_drops['position'][:, 1],
                  s=rain_drops['size'], lw=0.5, edgecolors=rain_drops['color'],
                  facecolors='none')

def update(frame_number):
    # 最も古い雨滴を再生成するためのインデックスを取得
    current_index = frame_number % n_drops

    # 時間の経過に伴い、全ての色を透明にする
    rain_drops['color'][:, 3] -= 1.0/len(rain_drops)
    rain_drops['color'][:, 3] = np.clip(rain_drops['color'][:, 3], 0, 1)

    # 全ての円を大きくする
    rain_drops['size'] += rain_drops['growth']

    # 最も古い雨滴の新しい位置を選択し、サイズ、色、成長率をリセットする
    rain_drops['position'][current_index] = np.random.uniform(0, 1, 2)
    rain_drops['size'][current_index] = 5
    rain_drops['color'][current_index] = (0, 0, 0, 1)
    rain_drops['growth'][current_index] = np.random.uniform(50, 200)

    # 散布図の集合を更新し、新しい色、サイズ、位置を反映させる
    scat.set_edgecolors(rain_drops['color'])
    scat.set_sizes(rain_drops['size'])
    scat.set_offsets(rain_drops['position'])

# アニメーションを構築し、更新関数をアニメーションの指導者として使用
animation = FuncAnimation(fig, update, interval=10, save_count=100)

#下の文のコメントアウトを外すと動画が保存されます.
animation.save('RainSimulation.mp4', writer='ffmpeg', fps=30)

# アニメーションをHTML5ビデオとして表示
HTML(animation.to_html5_video())

まとめ

Pythonのグラフ描画ライブラリmatplotlibでのアニメーションの作成と保存方法を学びました。

色や形、動きの違いなど、さまざまな要素を試してみることで、新たな創造力を引き出すことができるかもしれません。

Matplotlibの豊富な機能を活用して、楽しみながらプログラミングとアニメーション制作を深めていきましょう。

最後まで読んでいただきありがとうございました!

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