[matplotlib animation] 76. ランダムウォークする物体が最接近時に合体するアニメーション

matplotlib Animation

はじめに

この記事では、Pythonのmatplotlibライブラリを使用して、ランダムウォークする2つの物体が最も接近したときに合体するアニメーションを作成する方法について解説します。FuncAnimationクラスを活用し、物体の動きと合体のロジックを実装する手順を示します。

コード

解説

モジュールのインポートなど

バージョン

データの作成

np.random.randomを使用すると0〜1の範囲のランダムな値を生成できます。thetaは2.0np.piとnp.random.random(499)の積で、結果として0〜2πの範囲の値になります。

x座標とy座標はそれぞれthetaを媒介変数として、cos関数とsin関数で計算しています。 np.hstack((-5,np.cos(theta)))という構文でスタート地点を(-5,-5)に設定しています。 positionはnp.cumsum()(累積和)を使って、順次変化するランダムウォークの位置を取得しています。 position_x2とposition_y2も同じ方法で作成しています。

2点間の距離を求める

distance.euclidean関数を使用して2点間の距離を計算できます。リスト内包表記を活用し、すべての時間における2点間の距離を算出しました。その結果、最小距離は2.6681511847426154で、これは時間インデックス152で発生することがわかりました。この状況を図示すると以下のようになります。

2点のランダムウォークの表示

2点のランダムウォークを図示すると以下のようになります。

x,y軸の表示範囲の取得

アニメーション用の図のために、上に示した図の表示範囲をget_xlimとget_ylimで取得しておきます。

アニメーションの設定

図の表示など

ax.plot([], [])のように空のプロットを作成し、ここに後からデータをセットしてアニメーションを構築します。ax.axis(‘off’)で座標軸を非表示にし、ax.set(xlim=xlim, ylim=ylim)でグラフの表示範囲を設定します。

アニメーション関数の設定

set_data関数を使ってプロットにデータをセットします。点同士が最も接近したときには、p1.set_color(“C8”)でp1のプロットの色を変更し、p1.set_markersize(40)でマーカーのサイズを大きくします。同時に、p2.set_alpha(0)でp2のプロットを透明にして見えなくします。

アニメーションの表示

FuncAnimationを使ってアニメーションを表示します。フレーム数が250でインターバルが20msのため、合計で5秒のアニメーションになります。

HTML(ani.to_html5_video())を実行することで、Jupyter NotebookやJupyter Lab上にアニメーションを直接表示できます。

アニメーションをMP4形式で保存するには、ani.save('ファイル名', writer="ffmpeg", dpi=100)を使用します。また、savefig_kwargs = {'facecolor':'black'}を追加すると、黒背景のアニメーションを保存することができます。

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

まとめ

matplotlibとFuncAnimationを使用することで、ランダムウォークする物体の動きを表現し、物体同士の距離に基づいて合体するという物理的な現象をアニメーションとして視覚化することができます。このテクニックは、粒子シミュレーションや物理モデルの可視化に応用可能です。

参考

[matplotlib animation] 65. 2次元ランダムウォークアニメーション
matplotlibのFuncAnimationを使用して2次元ランダムウォークをアニメーション化する方法を解説。Pythonでの実装からパラメータ設定、保存方法まで、動的な可視化のテクニックを具体的なコード例で紹介しています。
2点の座標の距離を求めるならnumpyよりscipyの方が分かりやすい
2点間距離を求めるプログラムを調べると、numpyのノルムを求める関数を利用したものが多い。例えば import numpy as np x = np.array() y = np.array() answer = np.linalg.no
Distance computations (scipy.spatial.distance) — SciPy v1.16.2 Manual
numpy.random.random — NumPy v1.14 Manual
numpy.cumsum — NumPy v2.3 Manual

コメント