matplotlibのmplot3dモジュールを使用すると、Pythonで簡単に3Dグラフを作成できます。本記事では、3Dプロット作成の基本から応用までを具体的なコード例とともに解説します。
基本的な使い方
3Dグラフを作成するには、まずmatplotlibのmplot3dモジュールをインポートし、3D投影を指定する必要があります。3D投影の指定は、fig.add_subplot()
またはplt.subplot()
メソッドにprojection='3d'
パラメータを渡すことで行います。このパラメータにより、通常の2Dプロットではなく3D空間にグラフを描画するための特別な軸オブジェクト(Axes3D
)が作成されます。
以下のコードは、3D散布図を作成する基本的な方法を示しています。
pythonimport numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# データの生成
n = 100
x = np.random.standard_normal(n)
y = np.random.standard_normal(n)
z = np.random.standard_normal(n)
# 3Dプロットの作成
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, c=z, cmap='viridis', s=50, alpha=0.6)
# グラフのラベル設定
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')
ax.set_title('3D Scatter Plot')
plt.show()
# 出力: 3D散布図が表示される

様々な3Dグラフの種類
matplotlibでは、散布図以外にも様々な種類の3Dグラフを作成できます。
ワイヤーフレーム
ワイヤーフレームは、3D空間内の曲面をメッシュで表現します。このグラフはplot_wireframe()
メソッドを使用して作成します。主な設定パラメータは以下の通りです:
rstride
とcstride
:行と列のストライド(間隔)を指定し、メッシュの密度を調整します。値が小さいほど密なメッシュになります。color
:ワイヤーフレームの色を指定します。linewidth
:ワイヤーの線の太さを設定します。alpha
:透明度を0.0(完全に透明)から1.0(完全に不透明)の間で設定します。
ワイヤーフレームは複雑な数学関数の形状を視覚的に理解するのに適しています。
pythonimport numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# データの生成
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
# ワイヤーフレームプロットの作成
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(X, Y, Z, color='blue', rstride=2, cstride=2)
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')
ax.set_title('Wireframe Plot')
plt.show()
# 出力: ワイヤーフレームプロットが表示される

サーフェスプロット
サーフェスプロットは、3D曲面をカラーマップで表現します。このグラフはplot_surface()
メソッドを使用して作成します。主な設定パラメータは以下の通りです:
cmap
:カラーマップを指定します(例:’viridis’、’plasma’、’jet’など)。edgecolor
:エッジの色を指定します。’none’を指定するとエッジが表示されません。alpha
:サーフェスの透明度を設定します。rstride
とcstride
:行と列のストライドを指定します(ワイヤーフレームと同様)。facecolors
:各面の色を直接指定することもできます。shade
:サーフェスに陰影をつけるかどうかを指定します(True/False)。
サーフェスプロットは、データの高さと色の両方で値を表現できるため、3次元データの視覚化に非常に効果的です。colorbar()
を追加することで、色が表す値の範囲を示すことができます。
pythonimport numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# データの生成
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
# サーフェスプロットの作成
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none', alpha=0.8)
# カラーバーの追加
fig.colorbar(surf, ax=ax, shrink=0.5, aspect=5)
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')
ax.set_title('Surface Plot')
plt.show()
# 出力: サーフェスプロットが表示される

等高線プロット
3D空間内に2D等高線プロットを表示することもできます。このグラフはcontour()
メソッドを使用して作成します。主な設定パラメータは以下の通りです:
- 第4引数(例:
30
):等高線の数または等高線レベルのリストを指定します。 cmap
:等高線の色を表すカラーマップを指定します。extend3d
:Trueに設定すると、等高線が3D空間に拡張されます。linewidths
:等高線の線の太さを設定します。colors
:等高線の色を直接指定することもできます。alpha
:等高線の透明度を設定します。
3D等高線プロットは、2次元平面上の等高線を3D空間に投影することで、データの傾向をより直感的に把握できます。特に複雑な関数の特定の値を持つ領域を視覚化するのに役立ちます。
pythonimport numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# データの生成
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
# 3D等高線プロットの作成
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')
# 等高線プロット(より多くの等高線を表示)
cset = ax.contour(X, Y, Z, 30, cmap='viridis', extend3d=True, linewidths=1.5)
# カラーバーの追加
fig.colorbar(cset, ax=ax, shrink=0.5, aspect=5)
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')
ax.set_title('3D Contour Plot')
plt.show()
# 出力: 3D等高線プロットが表示される

詳細な設定
3Dグラフの見た目や機能をカスタマイズするための詳細設定について説明します。
視点の調整
view_init
メソッドを使用して、グラフの視点を調整できます。
pythonimport numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# データの生成
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
# 視点を調整したサーフェスプロット
fig = plt.figure(figsize=(15, 5))
# 視点1
ax1 = fig.add_subplot(131, projection='3d')
surf1 = ax1.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none')
ax1.view_init(elev=20, azim=30)
ax1.set_title('Elevation=20, Azimuth=30')
# 視点2
ax2 = fig.add_subplot(132, projection='3d')
surf2 = ax2.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none')
ax2.view_init(elev=50, azim=60)
ax2.set_title('Elevation=50, Azimuth=60')
# 視点3
ax3 = fig.add_subplot(133, projection='3d')
surf3 = ax3.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none')
ax3.view_init(elev=80, azim=120)
ax3.set_title('Elevation=80, Azimuth=120')
plt.tight_layout()
plt.show()
# 出力: 異なる視点から見た3つのサーフェスプロットが表示される

軸の範囲設定
set_xlim
、set_ylim
、set_zlim
メソッドを使用して、軸の範囲を設定できます。
pythonimport numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# データの生成
x = np.random.uniform(-5, 5, 100)
y = np.random.uniform(-5, 5, 100)
z = np.random.uniform(-5, 5, 100)
# 軸範囲を設定した3D散布図
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, c=z, cmap='plasma', s=50)
# 軸の範囲を設定
ax.set_xlim(-6, 6)
ax.set_ylim(-6, 6)
ax.set_zlim(-6, 6)
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')
ax.set_title('3D Scatter Plot with Custom Axis Limits')
plt.show()
# 出力: 軸範囲が設定された3D散布図が表示される

まとめ
本記事では、matplotlibのmplot3dモジュールを使った3Dグラフ作成方法を解説しました。基本的な3D散布図の作成から始まり、ワイヤーフレーム、サーフェスプロット、等高線プロットなどの様々な種類の3Dグラフの実装方法を紹介しました。また、視点の調整、軸の範囲設定などの詳細設定についても説明しました。
これらの知識を活用することで、データの3次元的な関係を効果的に可視化し、より深い洞察を得ることができます。matplotlibの3D機能は科学計算、データ分析、機械学習の結果表示など、多くの分野で役立つツールです。基本的な使い方を理解すれば、必要に応じて自分のデータに合わせたカスタマイズも容易に行えるでしょう。
より詳細な設定は公式ドキュメントを参照ください。