はじめに

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