はじめに
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次元のグラフとして散布図・曲面・ワイヤーフレームを学び、各軸の表示の仕方をまとめました