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

【Python】Matplotlibで回転する3Dグラフをアニメーション化する方法

Matplotlibで回転する3Dグラフを作成するには、Animationクラスを使用して関数を繰り返し呼び出します。この記事では、3Dサーフェスプロットをアニメーション化し、時間の経過とともに形状が変化する様子を可視化する手順を解説します。

実装の手順

  • メッシュグリッドの分割数(N)、1秒あたりのフレームレート(fps)、総フレーム数(frn)などの変数を初期化します。
  • 曲線を描くための x、y、z の配列を作成します。
  • lambda関数を使って z 配列を生成する関数を定義します。
  • Animationクラスに関数を渡すために、前のフレームのプロットを削除し、新しい x、y、z 配列からサーフェスを再描画するユーザー定義関数を作成します。
  • plt.figure() で新しい図を作成するか、既存の図をアクティブにします。
  • add_subplot() メソッドでサブプロットを追加し、3D投影を指定します。
  • set_zlim() メソッドでZ軸の表示範囲を設定します。
  • animation.FuncAnimation() を呼び出して、サーフェスプロットをアニメーション化します。
  • アニメーションを画面に表示するには show() メソッドを使用します。また save() メソッドを使えばGIFファイルとして保存することも可能です。

サンプルコード

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

plt.rcParams["figure.figsize"] = [7.00, 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)
ani.save('526.gif')

plt.show()

コードのポイント

このサンプルでは、2次元ガウス関数のシグマ値を np.sin() で周期的に変化させることで、山のような曲面が膨らんだり縮んだりするアニメーションを実現しています。change_plot() 関数内で plot[0].remove() を呼び出して前フレームのサーフェスを削除している点が重要です。これにより、古い描画が残らず滑らかなアニメーションになります。

また、animation.FuncAnimation() の引数には、対象のfigureオブジェクト、更新用の関数、フレーム数、追加引数(fargs)、フレーム間隔(interval:ミリ秒)を渡します。ani.save('526.gif') を実行すると、作成したアニメーションをそのままGIF画像として書き出せるので、プレゼンテーション資料やWebページへの掲載にも便利です。

実行結果

【Python】Matplotlibで回転する3Dグラフをアニメーション化する方法


  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のデータを使い、折れ線