『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

【Matplotlib】曲面の描画

Axes3D.plot_surface:曲面

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

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

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")

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

Axes3D.plot_trisurf:パラメータ曲面

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$ は媒介変数(パラメータ)です。

# PYTHON_MATPLOTLIB_TRISURF

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

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() を使うと ワイヤーフレーム を描くことができます。

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

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()

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

コメント