はじめに
matplotlibで3次元のグラフの書き方がわからなかったのでまとめてみました
前提
対象となる関数は2乗して足し合わせる関数を想定
def function(x, y):
return x**2 + y**2
描画準備
範囲指定
関数を描画するにあたって、x,yの範囲を指定して描画するためのグリッドを生成します
# x, yの各軸の描画範囲を指定
x = np.linspace(-5, 5, 11) # -5 ~ 5の範囲で11個のデータ均等に生成
y = np.linspace(-5, 5, 11)
xとyは下記のようなデータが生成されます
array([-5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5.])
グリッドの作成と関数の値の計算
meshgridを用いると格子状のデータをを用意に生成することが可能です
# 指定された範囲でグリッドの生成
X, Y = np.meshgrid(x, y)
meshgridを用いると下記のようにそれぞれが交差されたデータが生成されます
array([[-5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5.],
[-5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5.],
[-5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5.],
[-5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5.],
[-5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5.],
[-5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5.],
[-5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5.],
[-5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5.],
[-5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5.],
[-5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5.],
[-5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5.]]),
array([[-5., -5., -5., -5., -5., -5., -5., -5., -5., -5., -5.],
[-4., -4., -4., -4., -4., -4., -4., -4., -4., -4., -4.],
[-3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.],
[-2., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2.],
[-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[ 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
[ 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.],
[ 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4.],
[ 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5.]])
関数の値の計算
生成されたグリッドの値を使って関数の値を計算します
# 関数の値の計算
Z = function(X, Y)
①散布図
計算された値を用いて3次元の散布図を描画します
# 3次元散布図の描画
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.scatter(X, Y, Z)

②曲面
plot_surface を用いることで曲面を描画することが可能です
# 3次元曲面の描画
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.plot_surface(X, Y, Z)

③ワイヤーを用いた曲面の描画
plot_wireframe を用いることで曲面をワイヤーフレームで描画することが可能です
# 3次元曲面のワイヤーフレームでの描画
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.plot_wireframe(X, Y, Z)

ラベルやタイトルの表示
fig = plt.figure() ax = fig.add_subplot(projection='3d') # 点の色の変更&データラベルの設定 ax.plot_wireframe(X, Y, Z, color='red', label='データ') # グラフタイトルの設定
ax.set_title('2乗和(x^2, y^2)の散布図')
# x, y, z軸のラベル
ax.set_xlabel('X軸')
ax.set_ylabel('Y軸')
ax.set_zlabel('Z軸')
# データラベルの表示
ax.legend()
# グラフの表示
plt.show()

まとめ
3次元のグラフとして散布図・曲面・ワイヤーフレームを学び、各軸の表示の仕方をまとめました