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
(low, high, size)であるため、
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上にアニメーションを表示できる。
コメント