技術系サラリーマン勉強記

数学、物理、プログラミングなど日々勉強した内容を取り扱っていきます。

matplotlibで3Dプロットの作成

かっこいい三次元のグラフを作りたくなったので、matplotlibで3Dプロットを作る方法を調べました。そのメモを残します。

mplot3d Toolkit

mplot3dツールキットを使えば、グラフの軸を1つ増やすことができ、3Dプロットを作成することができます。

下記コードの2行目と4行目が三次元化する設定になります。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

後は、通常のグラフ作成の通りデータを用意しグラフを描画します。

グラフの種類は複数あるようです。

  • Line plos (折れ線グラフ)
  • Scatter plots (散布図)
  • Wireframe plots (メッシュ?プロット)
  • Surface plots (表面プロット)
  • Contour plots (等高線プロット)
  • Bar plots (棒グラフ) など

今後使いそうな、Line plots、Scatter plots、Surface Plotsの3種類のグラフを作成してみました。コードはほぼmatplotlibのチュートリアルと同じです。

3D Line & Scatter plots

特に難しくなく、plot関数またはscatter関数を呼び出し、引数にデータを指定すれば描画できます。

f:id:mysciphmt:20191209200029p:plain:w420

上図を表示するコードは以下の通り。簡単ですね。

%matplotlib inline

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

Surface Plots

plot_surface関数を用います。データは二次元配列であることに注意です。

f:id:mysciphmt:20191209200204p:plain:w420

コードは以下の通り。

%matplotlib inline

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

参考文献