3Dの座標値を出力する|Python


Pythonで3D表現をしてみた

2Dでのグラフ表示をしてみたので、今度は3D表示を試みてみた。
使用したのは
・MacOS
・PyCharm(エディタ)
numpy
matplotlib
mpl_toolkits
以上を使用します。

空間二次関数のグラフ

以下のような画像ができました。

X-Yビューでは1ずつ増やして
X座標 × Y座標 = Z座標 となるように表現してみました。

ではサンプルコードです。

plotAxes3D.py
# Numpy, Matplotlib
# mpl_toolkits.mplot3d を使って3D座標をプロット
#       --- 2020.06.16 ProOJI ---
#       --- No.1 ---
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# (x, y, z) 座標を作成
x = [i for i in range(21)]
y = [i for i in range(21)]
z = []
for i in range(21):
    z.append(i*i)

# 3Dでプロット
fig = plt.figure()
ax = Axes3D(fig)
ax.plot(x, y, z, "o-", color="red", ms=4, mew=0.5)

# 軸ラベル
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')

# 表示
plt.show()

空間サイクロン

こんなグラフも作成できます。

・サンプルコード 2

plotAxes3D_2.py
#
# Numpy, Matplotlib
# mpl_toolkits.mplot3d を使って3D座標をプロット
#       --- 2020.06.16 ProOJI ---
#       --- No.2 ---
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111, projection='3d')

# x, y, z成分のデータの作成
theta = np.linspace(-4*np.pi, 4*np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)

ax.plot(x, y, z, color='blue')
ax.scatter(x, y, z, color='blue')

plt.show()

空間サーフェイス

ちょっときれいなグラフも工夫次第でこんなふうにできてしまいます。

・サンプルコード 3

plotAxes3D_3.py
# Numpy, Matplotlib
# mpl_toolkits.mplot3d を使って3D座標をプロット
#       --- 2020.06.16 ProOJI ---
#       --- No.3 ---
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111, projection='3d')

# x, y, z成分のデータの作成
x = np.arange(-5, 5, 0.25)
y = np.arange(-5, 5, 0.25)
x, y = np.meshgrid(x, y)
r = np.sqrt(x**2 + y**2)
z = np.sin(r)

# 面データを作成します
surf = ax.plot_surface(x, y, z, cmap=plt.cm.coolwarm,
                      linewidth=0, antialiased=False)

# z軸の設定
ax.set_zlim(-1.01, 1.01)

# カラーバーの表示
fig.colorbar(surf, shrink=0.5, aspect=10)

plt.show()

まとめ

2Dでできることがそのまま3DでできてしまうPythonはあっぱれ!
同時にPythonの文法のみに詳しいだけでは足らず
やはりライブラリやフレームワークの知識はしっかりしていないと
と思えたこのたびでした。

・情報ソース
Mpl_toolkitsについて