はじめに
2つのランダムウォークする物体が最も近づいたときに合体するアニメーションをmatplotlib, FuncAnimationで表示する。
コード
解説
モジュールのインポートなど
バージョン
データの作成
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’}のようにすることで黒背景のアニメーションを保存することができる。
コードをダウンロード(.pyファイル) コードをダウンロード(.ipynbファイル)
コメント