Matplotlibのサーフェスプロット#

※記事内に商品プロモーションを含むことがあります。

公開日

この記事では、Matplotlibでサーフェスプロットを出力する方法を解説します。サーフェスプロットでは、複数のデータ点に囲まれた面を描画します。

サーフェスプロットの基本#

plt.subplots()subplot_kwオプションに{'projection': '3d'}という辞書形式データを与えることで、3次元のプロットになります。サーフェスプロットとするには、さらにax.plot_surface()メソッドを使います。

ax.plot_surface()メソッドにはデータ点のx, y, z座標を与えます。以下に例を示します。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 2*np.pi, 0.1)
y = np.arange(0, 4*np.pi, 0.1)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.sin(Y)

fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection': '3d'})
ax.plot_surface(X, Y, Z)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
plt.show()
../_images/b1ead7f6151df500fd970fb12dbad6d1636f8835ebff8f14a029aed5ec5700dc.png

なお、変数X, Y, Zはいずれも同じ大きさの2次元配列となります。

print(X.shape)
print(Y.shape)
print(Z.shape)
(126, 63)
(126, 63)
(126, 63)

ax.plot_surface()メソッドの主なオプションを以下に示します。

引数

説明

rcount, ccount

int

行・列方向の最大サンプル数。データ点数がこれより多い場合、ダウンサンプリングされる(デフォルト値:50)

rstride, cstride

int

ダウンサンプリングするときに飛ばすデータ点数

color

str

面の色

alpha

float

面の透明度

edgecolor

str

枠線の色

cmap

str

面のカラーマップ

vmin, vmax

float

カラーマップ範囲の最小値、最大値

shade

bool

シェーディング(陰影)処理の有無(デフォルト:True

rcountrstrideは片方のみ指定できます。同様に、ccountcstrideも片方のみ指定できます。

データのダウンサンプリング#

rcount, rstride, ccount, cstrideで描画する頂点の数を変更できます。

rcount=10, ccount=10として、描画点数をx, y軸方向にそれぞれ10点とした例を以下に示します。デフォルト値 (50) よりもメッシュが荒くなっていることが分かります。

fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection': '3d'})
ax.plot_surface(X, Y, Z, rcount=10, ccount=10)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
plt.show()
../_images/d740fb26cbe4bb883b69d37318bfb28c17a56f7aa4b92500c816957cc755c6f5.png

面の色#

colorオプションで面の色を指定できます。

fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection': '3d'})
ax.plot_surface(X, Y, Z, color="green")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
plt.show()
../_images/6f83f4269c6588c4ef7c8d5d4ec1d392fb1fbbeee5899794552f784126350ca3.png

指定可能な色については以下のページを参照下さい。

Matplotlib 色の書式

面の色の透明度#

面の色の透明度を指定するには、alphaオプションを使用します。0から1の範囲の値を取り、値が小さいほど透明になります(デフォルトは1)。以下にalpha=0.3とした例を示します。

fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection': '3d'})
ax.plot_surface(X, Y, Z, alpha=0.3)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
plt.show()
../_images/e81e95b5ea3f768c7f9c5b211f3064bbfa733a7cc7beedf7e1207b17cd2aa55f.png

枠線の色#

枠線の色をedgecolorオプションで指定できます。

fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection': '3d'})
ax.plot_surface(X, Y, Z, edgecolor="black")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
plt.show()
../_images/ee1a9d3ec1c0046e5d5b9876f9cc1e97c0bf1a45d21f1fbc183e10437f85d60d.png

カラーマップ#

cmapオプションで面のカラーマップを指定できます。z軸の値に応じて面の色が変化します。

fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection': '3d'})
ax.plot_surface(X, Y, Z, cmap="Blues")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
plt.show()
../_images/e5bd09a02c86c858397fc6a3252342c3056d0fbcfa8d7a4b0d7dff15c3236893.png

指定可能なカラーマップについては以下のページを参照下さい。

Matplotlibのカラーマップ

カラーバーを表示する場合、plt.colorbarを使用します。ax.pcolorの戻り値はPolyCollectionというクラスのオブジェクトです。これをplt.colorbarの最初の引数とします。また、axオプションにカラーバーを表示するグラフ(ここではax)を指定します。

fig, ax = plt.subplots(figsize=(8, 5), subplot_kw={'projection': '3d'})
mappable = ax.plot_surface(X, Y, Z, cmap="Blues")
plt.colorbar(mappable, ax=ax)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
fig.tight_layout()
plt.show()
../_images/a69b5ae148c8f8d33f858b320d6638d93b8a9d7d475dbb4abfc81c89e13cfac1.png

表示するカラーマップの範囲を固定したい場合、最小値と最大値をそれぞれvmin, vmaxで指定します。

カラーバーにラベルを付ける場合、plt.colorbarの戻り値を取得(以下ではcbarとしています)し、この戻り値のset_labelメソッドを使用します。

fig, ax = plt.subplots(figsize=(8, 5), subplot_kw={'projection': '3d'})
mappable = ax.plot_surface(X, Y, Z, cmap="Blues")
cbar = plt.colorbar(mappable, ax=ax)
cbar.set_label('Value')
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
fig.tight_layout()
plt.show()
../_images/0f05f55280991fddd64ba165b63b5f7e4486cfc1169f1cbf147aa6ab96d1e51b.png

シェーディング(陰影)#

ax.plot_surface()メソッドのshadeオプションでシェーディング(陰影)処理を行うか指定できます。True(デフォルト)の場合はシェーディング処理を行います。なお、cmapオプションでカラーマップを指定した場合、shade=Falseとなります。

fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection': '3d'})
ax.plot_surface(X, Y, Z, shade=True)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
ax.set_title("shade=True")
plt.show()

fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection': '3d'})
ax.plot_surface(X, Y, Z, shade=False)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
ax.set_title("shade=False")
plt.show()
../_images/35604a11ba05d641b1922f07d45a8101992b387236dcc01f9948f22de6dbe305.png ../_images/b7e0e8528474b7926b690c7b59aba58b1a0e01223522ecc2a99705451999bad6.png