【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 ワイヤーフレームで描いた双曲放物面

コメント