曲面の描画
Axes3D.plot_surface() で 3 次元座標に 曲面 を描くことができます。
X, Y, Z には 2 次元配列データを渡します。
サンプルコードでは $Z=\cos(\sqrt{X^2+Y^2})$ で表される曲面(同心円状に広がる波)を描いてみます。
# PYTHON_MATPLOTLIB_SURFACE
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")
パラメータ曲面
Axes3D.plot_trisurf() は、(X, Y, Z) に 1 次元配列を渡すと三角形メッシュを使って曲面を形成します。このメソッドを使うと媒介変数(パラメータ)で表された曲面を描くことができます。
サンプルコードでは
\[x=au\cos v,\quad y=bu\sin v,\quad z=u^2\]
という方程式で表される楕円放物面を描いてみます。$u$ と $v$ は媒介変数(パラメータ)です。
# PYTHON_MATPLOTLIB_TRISURF
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データサイエンスハンドブック ―Jupyter、NumPy、pandas、Matplotlib、scikit-learnを使ったデータ分析、機械学習 新品価格 | ![]() |

独学プログラマー Python言語の基本から仕事のやり方まで 中古価格 | ![]() |

新品価格 | ![]() |

ワイヤーフレーム
Axes3D.plot_wireframe() を使うとワイヤーフレームを描くことができます。
X, Y は 2 次元配列データを与えて格子点を作成し、それぞれの格子点に対して高度 Z を計算して曲面を描きます。以下のサンプルコードでは、$Z=X^2-Y^2$ という方程式で表される双曲放物面を描きます。
# PYTHON_MATPLOTLIB_WIREFRAME
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
# ワイヤーフレームで双曲放物面(hyperbolic paraboloid)を描く
ax.plot_wireframe(X, Y, Z, color = "darkblue")
plt.show()
コメントを書く