[Matplotlib] 曲面の描画

[Matplotlib] 曲面の描画

曲面の描画

 Axes3D.plot_surface()メソッドで 3 次元座標に曲面を描くことができます。

 Axes3D.plot_surface(X, Y, Z, *args, **kwargs)

 X, Y, Z には 2 次元配列データを渡します。
 サンプルコードでは $Z=\cos(\sqrt{X^2+Y^2})$ で表される曲面(同心円状に広がる波)を描いてみます。

# 曲面の描画

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Figureを追加
fig = plt.figure(figsize = (10, 6))

# FigureにAxesを追加
ax = fig.add_subplot(111, projection='3d')

# 軸ラベルを設定
ax.set_xlabel("x", size = 16, color = "b")
ax.set_ylabel("y", size = 16, color = "b")
ax.set_zlabel("z", size = 16, color = "b")

# 円周率
pi = np.pi

# 分割数
n = 256

# 範囲-4pi~4piをn分割して(x,y)データを作成
x = np.linspace(-4*pi, 4*pi, n)
y = np.linspace(-4*pi, 4*pi, n)

# 格子点の作成
X, Y = np.meshgrid(x, y)

# 高度の計算式
Z = np.cos(np.sqrt(X**2 + Y**2))

# 曲面を描画(カラーマップは'plasma_r')
ax.plot_surface(X, Y, Z, cmap = "plasma_r")

 Python 曲面(同心円型に広がる波)
 

パラメータ曲面

 Axes3D.plot_trisurf()メソッドは、(X, Y, Z) に 1 次元配列を渡すと三角形メッシュを使って曲面を形成します。このメソッドを使うと、媒介変数(パラメータ)で表された曲面を描くことができます。

 Axes3D.plot_trisurf(X, Y, Z, *args, **kwargs)

 サンプルコードでは
 
\[x=au\cos v,\quad y=bu\sin v,\quad z=u^2\]
という方程式で表される楕円放物面を描いてみます。$u$ と $v$ は媒介変数(パラメータ)です。

# 楕円放物面

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Figureを追加
fig = plt.figure(figsize = (8, 6))

# Figureに3DAxesを追加
ax = fig.add_subplot(111, projection='3d')

# 軸ラベルを設定
ax.set_xlabel("x", size = 16, color = "b")
ax.set_ylabel("y", size = 16, color = "b")
ax.set_zlabel("z", size = 16, color = "b")

# パラメータ
u = np.arange(0, 120, 0.01)
v = np.arange(0, 120, 0.01)
a = 2
b = 3

# 楕円放物面の方程式
X = a * u * np.cos(v)
Y = b * u * np.sin(v)
Z = u ** 2

# 曲面を描画(カラーマップはbwrを指定)
ax.plot_trisurf(X, Y, Z, cmap = "bwr")

 Python 楕円放物面
 

ワイヤーフレーム

 Axes3D.plot_wireframe()メソッドを使うとワイヤーフレームを描くことができます。

 Axes3D.plot_wireframe(X, Y, Z, *args, **kwargs)

 X, Y は 2 次元配列データを与えて格子点を作成し、それぞれの格子点に対して高度 Z を計算して曲面を描きます。以下のサンプルコードでは、$Z=X^2-Y^2$ という方程式で表される双曲放物面を描きます。

# ワイヤーフレームで描く双曲放物面(hyperbolic paraboloid)

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d

# Figureを追加
fig = plt.figure(figsize = (10, 6))

# 3DAxesを追加
ax = fig.add_subplot(111, projection="3d")

# Axes(サブプロット)のタイトルを設定
ax.set_title("hyperbolic paraboloid", size = 16)

# 軸ラベルを設定
ax.set_xlabel("x", size = 16)
ax.set_ylabel("y", size = 16)
ax.set_zlabel("z", size = 16)

# (x,y)データを作成
x = np.linspace(-8, 8, 256)
y = np.linspace(-8, 8, 256)

# 格子点の作成
X, Y = np.meshgrid(x, y)

# 高度の計算式
Z = X**2 - Y**2

# ワイヤーフレームを描画
ax.plot_wireframe(X, Y, Z, color = "darkblue")

plt.show()

 Python Matplotlib ワイヤーフレームで描いた双曲放物面