Python
 Computer >> コンピューター >  >> プログラミング >> Python

Matplotlibで3Dのplot_surfaceをアニメーション化する方法を解説

Matplotlibでは、animation.FuncAnimationクラスを活用することで、3Dのplot_surface(サーフェスプロット)を簡単にアニメーション化できます。この記事では、ガウス関数の形状が時間とともに変化する3Dアニメーションを例に、具体的な実装手順をわかりやすく解説します。

アニメーション作成の手順

Matplotlibで3Dのplot_surfaceをアニメーション化するには、以下の手順に従います。

  1. メッシュグリッド数(N)、1秒あたりの関数呼び出し頻度(fps)、フレーム数(frn)といった変数を初期化します。
  2. 曲線を描くためのxyzの各配列を作成します。
  3. ラムダ式(無名関数)を使ってz配列を生成する関数を定義します。
  4. animationクラスに関数を渡すため、「前回のプロットを削除して、x・y・z配列をもとに新しいサーフェスを描画する」ユーザー定義関数を作成します。
  5. 新しい図を作成するか、既存の図をアクティブにします。
  6. subplots()メソッドでサブプロットの配置を追加します。
  7. set_zlim()メソッドでZ軸の表示範囲を設定します。
  8. animationクラスを呼び出して、サーフェスプロットをアニメーション化します。
  9. show()メソッドで図を表示します。

サンプルコード

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

N = 50
fps = 250
frn = 75

x = np.linspace(-4, 4, N + 1)
x, y = np.meshgrid(x, x)
zarray = np.zeros((N + 1, N + 1, frn))

f = lambda x, y, sig: 1 / np.sqrt(sig) * np.exp(-(x ** 2 + y ** 2) / sig ** 2)

for i in range(frn):
    zarray[:, :, i] = f(x, y, 1.5 + np.sin(i * 2 * np.pi / frn))

def change_plot(frame_number, zarray, plot):
    plot[0].remove()
    plot[0] = ax.plot_surface(x, y, zarray[:, :, frame_number], cmap="afmhot_r")

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

plot = [ax.plot_surface(x, y, zarray[:, :, 0], color='0.75', rstride=1, cstride=1)]

ax.set_zlim(0, 1.1)
ani = animation.FuncAnimation(fig, change_plot, frn, fargs=(zarray, plot), interval=1000 / fps)

ax.axis('off')

plt.show()

コードのポイント解説

1. ラムダ式によるz配列の生成

変数fには、中心からの距離に応じて値が減衰するガウス関数をラムダ式で定義しています。引数sig(シグマ)の値を変えることで、山の広がり具合が変化します。forループの中でsig1.5 + sin(...)として少しずつ変化させ、フレームごとのz配列をzarrayに格納していきます。

2. フレーム更新用のユーザー定義関数

change_plot()は、FuncAnimationが各フレームで呼び出す関数です。plot[0].remove()で前フレームのサーフェスを削除し、そのフレーム番号に対応するz配列を使ってax.plot_surface()で再描画します。カラーマップには暖色系の「afmhot_r」を指定し、高さの違いを色で表現しています。

3. FuncAnimationの設定

animation.FuncAnimation()の第3引数にフレーム数(frn)を渡し、fargsでz配列とプロットオブジェクトを更新関数に渡しています。interval=1000 / fpsにより、250fps相当の滑らかなアニメーションになります。また、ax.set_zlim(0, 1.1)でZ軸の範囲を固定しているため、フレームが切り替わっても軸スケールがぶれません。

実行結果

このコードを実行すると、シグマ値がsin波に沿って周期的に変化することで、中央の山が膨らんだり縮んだりする3Dサーフェスアニメーションが表示されます。

Matplotlibで3Dのplot_surfaceをアニメーション化する方法を解説


  1. Matplotlibでpcolormeshをアニメーション化する方法【コード例付き解説】

    Matplotlibでpcolormesh(擬似カラープロット)をアニメーション化する方法を、具体的な手順とサンプルコード付きで解説します。 アニメーション化の基本的な流れ pcolormeshをアニメーションさせるには、以下の手順に従います。 figureオブジェクトとサブプロットを作成する numpyを使ってx、y、tのデータポイントを生成する meshgrid関数で座標ベクトルから座標行列(X3、Y3、T3)を作成する pcolormesh()メソッドを使って、不規則な矩形グリッド上に擬似カラープロットを描画する カラーバーをfigureに追加する FuncAnimationクラスを使

  2. Matplotlibで折れ線グラフをアニメーション化する方法を徹底解説

    Matplotlibでは、FuncAnimationを活用することで、折れ線グラフに動きのあるアニメーション効果を簡単に加えることができます。本記事では、基本的な手順と実際に動作するサンプルコードを交えながら、その方法をわかりやすく解説します。折れ線グラフをアニメーション化する基本手順subplots()メソッドを使用して、図(figure)とサブプロットを作成します。x軸・y軸それぞれの表示範囲(スケール)を設定します。NumPyを使って、xおよびtのデータ点を生成します。座標ベクトルからmeshgrid()で座標行列X2とT2を作成します。plot()メソッドでxとFのデータを使い、折れ線