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

matplotlib Animation

はじめに

2つのランダムウォークする物体が最も近づいたときに合体するアニメーションをmatplotlib, FuncAnimationで表示する。

コード

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

解説

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

バージョン

データの作成

np.random.randomはランダムな0〜1の要素を得ることができる。thetaは2.0*np.pi*np.random.random(499)と2πをかけているので、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(点1, 点2)で点1と点2の距離を求められる。リスト内包表記により、すべての時間での距離を求めた。その結果、最小値は2.6681511847426154で最小値のインデックスは152であることがわかった。

図示すると以下のようになる。

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

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

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

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

アニメーションの設定

図の表示など

ax.plot([], [])のようにblankのプロットを作成して、ここにデータをセットすることでアニメーションとする。
ax.axis(‘off’)で軸を消して、ax.set(xlim=xlim, ylim=ylim)で軸の表示範囲を設定する。

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

set_dataでプロットにデータをセットする。

点同士が最も接近するときに、 p1.set_color(“C8”)でp1のplotの色を変え、 p1.set_markersize(40)でマーカーサイズを大きくして、p2のplotを p2.set_alpha(0)で見えなくする。

アニメーションの表示

FuncAnimationでアニメーションを表示する。frame数が250でintervalが20msなので5秒のアニメーションとなる。
HTML(ani.to_html5_video())により、jupyter notebook またはjupyter lab上にアニメーションを表示できる。

ani.save(‘ファイル名’, writer=”ffmpeg”,dpi=100)でアニメーションをMP4形式で保存することができる。また、savefig_kwargs = {‘facecolor’:’black’}のようにすることで黒背景のアニメーションを保存することができる。

参考

[matplotlib animation] 65. 2次元ランダムウォークアニメーション
matplotlibのFuncAnimationで2次元のランダムウォークアニメーションを表示する。
2点の座標の距離を求めるならnumpyよりscipyの方が分かりやすい
2点間距離を求めるプログラムを調べると、numpyのノルムを求める関数を利用したものが多い。例えばimport numpy as npx = np.array()y = np.array()answer = np.linalg.norm(x
Distance computations (scipy.spatial.distance) — SciPy v1.5.2 Reference Guide
numpy.random.random — NumPy v1.14 Manual
numpy.cumsum — NumPy v1.19 Manual

コメント