[matplotlib animation] 22. 雨(Rain simulation)

matplotlib Animation

matplotlib FuncAnimationによる雨のアニメーション

コード

解説

モジュールのインポート

グラフの設定

図の大きさはfigsize(7,7)の四角としている。
add_axes(0,0,1,1)では、表示位置と比を(left, bottom, width, height)のように指定できるので、左端と下端を0にして、幅と高さを1とすることでfig全体に図を描写する設定としている。

ax.set_xlim(0, 1), ax.set_xticks([])

でx軸の表示範囲を0〜1にして、x軸のラベルを非表示としている。y軸も同様。

データの生成

このrain_dropsはNumPyの構造化配列でdtypeによって、それぞれの名前とフォーマットとサイズを指定している。

np.random.uniformにより、範囲を指定した乱数を得ることができる。
np.random.uniform(lowhighsize)であるため、
positionは(50,2)の形の0〜1の間のいずれかを要素とする配列となり、
growthは50個の50〜200のいずれか要素とする配列となる。

アニメーション表示するグラフの設定

散布図のアニメーションを作成する。まず、positionの0列目をx、1列目をyとしてプロットする。
sで散布図の点の大きさを指定できるのでsizeで設定する。
lwはlinewidthの略で線の太さを0.5としている。
edgecolorは点の輪郭の色で構造化配列のcolorを適用している。
facecolorは塗りつぶしの色でNoneなので、塗りつぶし無しで描写する。

アニメーションの設定

アニメーションで変化させる要素の設定

アニメーションで変化させる要素は、current_index = frame_number % n_dropsとすることで求めている。これは、frame_numberをn_drops=50で割ったときの余りとなっている。

雨の輪郭が薄くなっていく設定

時間の経過に伴って雨の輪郭が薄くなる設定をcolorの3番目の要素である透明度(アルファ値)を変化させることで表現している。frame_numberが増加するたびにアルファ値に対して -= 1.0/len(rain_drops)の計算をすることで透明にしていく。

アルファ値が0以下になった場合には、 np.clip(rain_drops[‘color’][:, 3], 0, 1)とすることで0以下のアルファ値を0にしている。

雨の輪郭の拡大の設定

散布図の点のサイズ’size’に’growth’を足していくことで、frame_numberの増加に伴う雨の輪郭の拡大を表現している。

新しい雨粒の作成

current_indexの古い雨粒をリセットして、新しい雨粒を作成している。

potisionとgrowthは初期設定と同じランダムで、sizeが5でcolorが(0,0,0,1)であるため完全不透明の雨粒となっている。colorは(r,g,b,α)であるため、(1,0,0,1)とすると赤い雨になる。

値の更新

scat.set_XXXでデータの更新を行っている。

アニメーションの表示

animation = FuncAnimation(fig, update, interval=10)でfigに対して、uddateを100回実行して、intervalを10 msとするので、1 sのアニメーションとなる。

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

とすればjupyter notebook上にアニメーションを表示できる。

参考

NumPyの使い方(12) 乱数、random - Remrinのpython攻略日記
乱数を発生させるライブラリは主に2つ。randomライブラリとNumPyのrandom 2つのライブラリの一番の違いは乱数の発生個数。 乱数の発生個数 randomモジュール :乱数1個 numpyは配列の形をsize=~の形のキーワード引...
numpyで数値が指定範囲にいない場合に、指定範囲のmin/maxに置き換えたい : mwSoft blog

コメント