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関数を呼び出し、引数にデータを指定すれば描画できます。
上図を表示するコードは以下の通り。簡単ですね。
%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関数を用います。データは二次元配列であることに注意です。
コードは以下の通り。
%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()