Matplotlib による雨のシミュレーション

Beginner

This tutorial is from open-source community. Access the source code

はじめに

この実験では、Python の Matplotlib ライブラリを使って雨のシミュレーションを作成する方法についての手順を追ったチュートリアルです。このシミュレーションでは、50 個の散布図の点の大きさと透明度をアニメーション化して、表面に降り注ぐ雨滴をシミュレートします。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替えて、Jupyter Notebook を使って練習しましょう。

時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題に直面した場合は、Labby にお尋ねください。セッション後にフィードバックを提供してください。私たちは迅速に問題を解決いたします。

新しい Figure と Axes を作成する

最初のステップは、新しい Figure とそれを埋め尽くす Axes を作成することです。これが、シミュレーションが描画されるキャンバスになります。

fig = plt.figure(figsize=(7, 7))
ax = fig.add_axes([0, 0, 1, 1], frameon=False)
ax.set_xlim(0, 1), ax.set_xticks([])
ax.set_ylim(0, 1), ax.set_yticks([])

雨のデータを作成する

次に、雨のデータを作成します。ランダムな位置に、ランダムな成長率と、ランダムな色を持つ 50 個の雨滴を作成します。

n_drops = 50
rain_drops = np.zeros(n_drops, dtype=[('position', float, (2,)),
                                      ('size',     float),
                                      ('growth',   float),
                                      ('color',    float, (4,))])

rain_drops['position'] = np.random.uniform(0, 1, (n_drops, 2))
rain_drops['growth'] = np.random.uniform(50, 200, n_drops)

散布図を作成する

次に、雨滴が成長するにつれてアニメーションの間に更新する散布図を作成します。

scat = ax.scatter(rain_drops['position'][:, 0], rain_drops['position'][:, 1],
                  s=rain_drops['size'], lw=0.5, edgecolors=rain_drops['color'],
                  facecolors='none')

更新関数を作成する

更新関数は、FuncAnimation オブジェクトによって呼び出され、アニメーションの間に散布図を更新します。

def update(frame_number):
    ## 最古い雨滴を再生成するために使用できるインデックスを取得します。
    current_index = frame_number % n_drops

    ## 時間の経過とともにすべての色をより透明にします。
    rain_drops['color'][:, 3] -= 1.0/len(rain_drops)
    rain_drops['color'][:, 3] = np.clip(rain_drops['color'][:, 3], 0, 1)

    ## すべての円を大きくします。
    rain_drops['size'] += rain_drops['growth']

    ## 最古い雨滴の新しい位置を選択し、そのサイズ、色、成長係数をリセットします。
    rain_drops['position'][current_index] = np.random.uniform(0, 1, 2)
    rain_drops['size'][current_index] = 5
    rain_drops['color'][current_index] = (0, 0, 0, 1)
    rain_drops['growth'][current_index] = np.random.uniform(50, 200)

    ## 新しい色、サイズ、位置で散布コレクションを更新します。
    scat.set_edgecolors(rain_drops['color'])
    scat.set_sizes(rain_drops['size'])
    scat.set_offsets(rain_drops['position'])

アニメーションを作成する

最後に、FuncAnimation オブジェクトを使用してアニメーションを作成します。ここでは、グラフ、更新関数、フレーム間の間隔(ミリ秒)、および保存するフレーム数を指定します。

animation = FuncAnimation(fig, update, interval=10, save_count=100)
plt.show()

まとめ

この実験では、Python の Matplotlib ライブラリを使って雨のシミュレーションを作成する方法を学びました。新しい Figure と Axes を作成し、雨のデータを作成し、散布図を構築し、更新関数を作成し、FuncAnimation オブジェクトを使ってアニメーションを作成しました。