Matplotlib を使ったアニメーション付きサブプロットの作成

Beginner

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

はじめに

この手順に従った実験では、Python の Matplotlib を使って複数のサブプロット付きのアニメーションを作成する方法を示します。この例では、2 つの異なるサブプロットに円とサインカーブをアニメーション化する方法を示しています。

VM のヒント

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

Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証は自動化できません。

学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

ライブラリのインポート

最初のステップは、必要なライブラリをインポートすることです。これには、Matplotlib、NumPy、および Matplotlib のアニメーションモジュールが含まれます。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
from matplotlib.patches import ConnectionPatch

グラフとサブプロットの作成

2 番目のステップは、アニメーションに使用するグラフとサブプロットを作成することです。この例では、異なるアスペクト比の 2 つのサブプロットを横並びに作成します。左のサブプロットは単位円で、右のサブプロットはサインカーブをアニメーション化するための空のプロットです。

fig, (axl, axr) = plt.subplots(
    ncols=2,
    sharey=True,
    figsize=(6, 2),
    gridspec_kw=dict(width_ratios=[1, 3], wspace=0),
)
axl.set_aspect(1)
axr.set_box_aspect(1 / 3)
axr.yaxis.set_visible(False)
axr.xaxis.set_ticks([0, np.pi, 2 * np.pi], ["0", r"$\pi$", r"$2\pi$"])

円と初期点の描画

3 番目のステップは、左のサブプロットに円と初期点を描画することです。円を生成するために角度の配列を作成し、その後、各角度のサインとコサインをプロットします。また、原点に 1 点をプロットします。

x = np.linspace(0, 2 * np.pi, 50)
axl.plot(np.cos(x), np.sin(x), "k", lw=0.3)
point, = axl.plot(0, 0, "o")

サインカーブの描画

4 番目のステップは、右のサブプロットにサインカーブを描画することです。角度の配列を作成し、その後、各角度のサインをプロットします。また、アニメーションの後半で更新する sine プロットオブジェクトを保存します。

sine, = axr.plot(x, np.sin(x))

接続線の描画

5 番目のステップは、2 つのサブプロットを結ぶ点線を描画することです。左のサブプロットの原点と右のサブプロットの右辺を結ぶ ConnectionPatch オブジェクトを作成します。また、アニメーションの後半で更新する con パッチオブジェクトを保存します。

con = ConnectionPatch(
    (1, 0),
    (0, 0),
    "data",
    "data",
    axesA=axl,
    axesB=axr,
    color="C0",
    ls="dotted",
)
fig.add_artist(con)

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

6 番目のステップは、アニメーション関数を定義することです。この関数はアニメーションの各フレームで呼び出され、左のサブプロット上の点の位置、右のサブプロット上のサインカーブの位置とデータ、接続パッチの位置を更新します。

def animate(i):
    x = np.linspace(0, i, int(i * 25 / np.pi))
    sine.set_data(x, np.sin(x))
    x, y = np.cos(i), np.sin(i)
    point.set_data([x], [y])
    con.xy1 = x, y
    con.xy2 = i, y
    return point, sine, con

アニメーションの作成

7 番目のステップは、FuncAnimation 関数を使ってアニメーションオブジェクトを作成することです。グラフオブジェクト、アニメーション関数、フレーム間のインターバル(ミリ秒)、フレーム数、そしてアニメーションを繰り返す前の遅延を渡します。

ani = animation.FuncAnimation(
    fig,
    animate,
    interval=50,
    blit=False,  ## blitting can't be used with Figure artists
    frames=x,
    repeat_delay=100,
)

アニメーションの表示

最後のステップは、pyplot モジュールの show 関数を使ってアニメーションを表示することです。

plt.show()

まとめ

この手順に従った実験では、Python の Matplotlib を使って複数のサブプロット付きのアニメーションを作成する方法を示しました。この例では、2 つの異なるサブプロットにまたがって円とサインカーブをアニメーション化する方法を示しました。手順には、ライブラリのインポート、グラフとサブプロットの作成、円と初期点の描画、サインカーブの描画、接続線の描画、アニメーション関数の定義、アニメーションオブジェクトの作成、そしてアニメーションの表示が含まれます。