アニメーション3Dグラフ

アニメーション3Dグラフ

Google Colab環境を使って、アニメーションする3Dグラフを描画します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# Google Colabでの設定
from IPython.display import HTML
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation

# データの生成
x = np.linspace(-2 * np.pi, 2 * np.pi, 200)
y = np.linspace(-2 * np.pi, 2 * np.pi, 200)
x, y = np.meshgrid(x, y)
z = np.sin(np.sqrt(x**2 + y**2))

# プロットの設定
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 初期状態のプロット
line = ax.plot_surface(x, y, z, cmap='viridis')

# アニメーションの更新関数
def update(frame):
global z, line
ax.clear()
z = np.sin(np.sqrt(x**2 + y**2) + frame / 10.0)
line = ax.plot_surface(x, y, z, cmap='viridis')
ax.set_zlim(-1, 1)
return line,

# アニメーションの設定
ani = FuncAnimation(fig, update, frames=200, interval=50, blit=False)

# アニメーションをHTMLとして表示
HTML(ani.to_jshtml())

このコードでは、np.sqrt(x**2 + y**2)のようなより複雑な関数を使い、カラーマップviridisを適用しています。

これにより、アニメーションがカラフルで視覚的に魅力的になります。

【実行手順】

  1. Google Colabを開きます。
  2. 新しいノートブックを作成します。
  3. 上記のコードをセルにコピーして貼り付けます。
  4. セルを実行します。

アニメーション3Dグラフがカラフルで複雑な形状で表示されるはずです。

[実行結果]

ソースコード解説

ソースコードを詳しく説明します。

1. 必要なライブラリのインポート

1
2
3
4
5
from IPython.display import HTML
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation
  • IPython.displayHTMLGoogle ColabJupyter NotebookでHTML形式の出力を表示するためのモジュール。
  • numpy (np): 数値計算ライブラリ。数値データの生成と操作に使用。
  • matplotlib.pyplot (plt): データの可視化ライブラリ。プロットの生成に使用。
  • mpl_toolkits.mplot3dAxes3D: 3Dプロットを生成するためのツールキット。
  • matplotlib.animationFuncAnimation: アニメーションを生成するためのモジュール。

2. データの生成

1
2
3
4
x = np.linspace(-2 * np.pi, 2 * np.pi, 200)
y = np.linspace(-2 * np.pi, 2 * np.pi, 200)
x, y = np.meshgrid(x, y)
z = np.sin(np.sqrt(x**2 + y**2))
  • np.linspace(-2 * np.pi, 2 * np.pi, 200): -2πからまでの範囲を200等分した配列を生成。
  • np.meshgrid(x, y): 2次元グリッドを生成。xyの全ての組み合わせを含む。
  • np.sqrt(x**2 + y**2): 各グリッドポイントのxyの二乗和の平方根を計算。
  • np.sin(...): 平方根の値をサイン関数に適用し、zの値を計算。

3. プロットの設定

1
2
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
  • plt.figure(): 新しい図(figure)を作成。
  • fig.add_subplot(111, projection='3d'): 3Dプロットを作成するための軸(axes)を追加。

4. 初期状態のプロット

1
line = ax.plot_surface(x, y, z, cmap='viridis')
  • ax.plot_surface(x, y, z, cmap='viridis'): x, y, zのデータを用いて3Dサーフェスプロットを作成。
    cmap='viridis'はカラーマップを指定。

5. アニメーションの更新関数

1
2
3
4
5
6
7
def update(frame):
global z, line
ax.clear()
z = np.sin(np.sqrt(x**2 + y**2) + frame / 10.0)
line = ax.plot_surface(x, y, z, cmap='viridis')
ax.set_zlim(-1, 1)
return line,
  • update(frame): アニメーションの各フレームで呼び出される関数。
    • ax.clear(): 現在のプロットをクリア。
    • z = np.sin(np.sqrt(x**2 + y**2) + frame / 10.0): zの値をフレームごとに更新。
    • line = ax.plot_surface(x, y, z, cmap='viridis'): 更新されたzの値で新しいサーフェスプロットを作成。
    • ax.set_zlim(-1, 1): z軸の範囲を設定。
    • return line,: 更新されたプロットを返す。

6. アニメーションの設定

1
ani = FuncAnimation(fig, update, frames=200, interval=50, blit=False)
  • FuncAnimation(fig, update, frames=200, interval=50, blit=False): アニメーションを作成するための関数。
    • fig: アニメーションを表示する図。
    • update: フレームごとに呼び出される更新関数。
    • frames=200: フレームの数。
    • interval=50: フレーム間の時間間隔(ミリ秒)。
    • blit=False: フル再描画を行うかどうか。

7. アニメーションをHTMLとして表示

1
HTML(ani.to_jshtml())
  • HTML(ani.to_jshtml()): アニメーションをHTML形式に変換し、Google ColabJupyter Notebookで表示。