matplotlib 3次元散布図

matplotlibで3次元の散布図を描画する方法について解説します。(カラーバーに関する記事はこちらに移動しました。)

3次元散布図

3次元の散布図を描画する場合、mpl_toolkits.mplot3d.axes3dというライブラリを追加でインポートします。add_subplotの引数にprojection='3d'を指定します。

from matplotlib import pyplot as plt
import numpy as np

# ランダムな点を生成
x = np.random.rand(50)
y = np.random.rand(50)
z = np.random.rand(50)

# figureを生成
fig = plt.figure()

# axをfigureに設定
ax = fig.add_subplot(1, 1, 1, projection='3d')

# axesにplot
ax.scatter(x, y, z, c='b')

# 表示する
plt.show()

実行結果

なお、出力結果についてはマウスのドラッグ・アンド・ドロップで方向を動かすことも可能です。

別アングル 下から眺めてみる

描画する点が多くなると、環境によってはレンダリングに時間がかかります。あと、奥の点ほど色が薄く描画されていますが、点が持つ値が表現されているわけではないという点に留意してください。点が持つ値や量を表す場合は次に説明するカラーバーを利用してください。

3次元でカラーバーを利用する場合

先程の散布図では単純に3次元空間上の点の分布について表現していました。カラーバーを使うと3次元上の点の分布に加え、それぞれ持つ量を可視化することが可能です。例えば観測施設内に設置したセンサーで得た気温等の値の分布を表現することが可能です。カラーマップを使用しますがそれについては前回の記事を参照してください。matplotlib カラーバー付き散布図

from matplotlib import pyplot as plt
import numpy as np

# ランダムな点を生成する(x, y, z座標)
x = np.random.rand(50)
y = np.random.rand(50)
z = np.random.rand(50)

# 点(x, y, z)がもつ量
value = np.random.rand(50)

# figureを生成する
fig = plt.figure()

# axをfigureに設定する
ax = fig.add_subplot(1, 1, 1, projection='3d')

# カラーマップを生成
cm = plt.cm.get_cmap('RdYlBu')

# axに散布図を描画、戻り値にPathCollectionを得る
mappable = ax.scatter(x, y, c=value, cmap=cm)
fig.colorbar(mappable, ax=ax)

# 表示する
plt.show()

実行結果

上のサンプルコードでは3次元上の座標列x, y, zに加え、valueがそれぞれの点がもつ値の配列を表しています。

matplotlib3.5以前

古いバージョンについては以下の通りAxes3Dを使用します。

from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D


# ランダムな点を生成する(x, y, z座標)
x = np.random.rand(50)
y = np.random.rand(50)
z = np.random.rand(50)

# figureを生成
fig = plt.figure()

# axをfigureに設定
ax = Axes3D(fig, auto_add_to_figure=False)
fig.add_axes(ax)

# axesに散布図を設定
ax.scatter(x, y, z, c='b')

# 表示
plt.show()