[Python] 簡単に3次元グラフを作成!

グラフ作成

概要

こんにちは、すのくろです。

今回はpythonで3次元グラフを作成する方法についてです。

具体的なグラフとしては、

  • 3次元散布図
  • 曲面
  • 格子点
  • 3次元散布図とその平面の傾き

となります。

3つの要素の関係性をまとめる時などに3次元グラフは役立つため、今回の記事が参考になれば幸いです。

それではやっていきましょう!

3次元散布図 scatter(x, y, z)

まず初めに3次元散布図の作成です。

本記事でグラフ用に扱うライブラリとデータを下記で作成しておきます。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt #グラフ用
from mpl_toolkits.mplot3d import Axes3D  #3Dplot用のライブラリ 

# データの用意
x = np.random.randint(1, 10, 10)
y = np.random.randint(10, 50, 10)
z = np.random.randint(100, 200, 10)

print(x)
print(y)
print(z)

### 
# x: [7 8 2 5 6 5 8 3 1 9]
# y: [13 33 11 23 16 39 17 46 23 27]
# z: [106 163 138 145 153 102 189 137 123 168]

3次元散布図は下記の流れで作成していきます。

  • Figureを作成
  • 「projection=’3d’」で3次元軸を追加
  • ax.scatter(x, y, z)で3要素を与えてグラフ描画

下記コードが3次元散布図作成の例です。

# 3次元散布図

# Figureを追加
fig = plt.figure(figsize = (5, 5))

# 3DAxesを追加
ax = fig.add_subplot(projection='3d')

ax.scatter(x, y, z)

# 軸ラベルを設定
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")

曲面グラフ plot_surface(X, Y, Z)

次に曲面グラフの作成方法です。方法としては、plot_surface を使います。

作成方法は ax.plot_surface(x座標, y座標, z座標)です。

しかし 、x,y座標は格子状に与える必要ため、上記で作成したx,yは使えないため、格子状の座標はnp.meshgridで作成可能です。

z座標も単純なリストではなく、格子の形状と同様の形状の配列を与える必要があります。

曲面の作成の流れは下記の通りです。

  • x, yから格子状の座標を「np.meshgrid」で作成
  • zも格子状の座標を用いる
  • ax.plot_surface(x座標, y座標, z座標)で局面作成

下記コードが曲面グラフ作成の例です。

# 曲面を描画

fig = plt.figure(figsize = (5, 5))
ax = fig.add_subplot(projection='3d')

X, Y = np.meshgrid(x, y)

Z = X**2/ Y

ax.plot_surface(X, Y, Z, alpha=0.7)

格子点(ワイヤーフレーム)plot_wireframe(X, Y, Z)

格子点のプロットには plot_wireframe を使います。

作成方法は ax.plot_wireframe(x座標, y座標, z座標)です。

しかし 、格子点は、曲面作成時と同様に、x, y, z座標は格子状に与える必要ため、格子状の座標はnp.meshgridで作成して用います。

格子点の作成の流れは下記の通りです。

  • x, yから格子状の座標を「np.meshgrid」で作成
  • zも格子状の座標を用いる
  • ax.plot_wireframe(x座標, y座標, z座標)で格子点作成

下記コードが格子点グラフ作成の例です。

# 格子点を作成

fig = plt.figure(figsize = (5, 5))
ax = fig.add_subplot(projection='3d')

X, Y = np.meshgrid(x, y)

Z = X + Y

ax.plot_wireframe(X, Y, Z)

三次元散布図とその平面の傾き

最後に三次元散布図とその平面の傾きを算出する方法です。

こちらはxとyの2要素からzがどのように変化するのかを視覚的にみやすくするために便利に使えます。

作成方法の流れは下記の通りです。

  • 近似用に、x,y のそれぞれの範囲で細かな点を作成
  • x, y 格子点の作成
  • 格子点から線形近似で線(平面)を作成
  • ax.scatter(x, y, z)とax.plot_wireframe()でグラフ描画

下記コードが三次元散布図とその平面の傾きグラフ作成の例です。

# 3次元散布図とその平面の傾き

from sklearn.linear_model import LinearRegression

# 近似用に、x,y のそれぞれの範囲で細かな点を作成
mesh_x = np.arange(x.min(), x.max(), (x.max() - x.min())/20)
mesh_y = np.arange(y.min(), y.max(), (y.max() - y.min())/20)

# 格子点の作成
mesh_xx, mesh_yy = np.meshgrid(mesh_x, mesh_y)

# 格子点から線形近似で線(平面)を作成
xy = np.array([x, y]).T
model_lr = LinearRegression()
model_lr.fit(xy, z)

mesh_z = model_lr.coef_[0] * mesh_xx + model_lr.coef_[1] * mesh_yy + model_lr.intercept_

# グラフ描画
fig = plt.figure(figsize = (5, 5))
ax = fig.add_subplot(projection='3d')

ax.scatter(x, y, z)
ax.plot_wireframe(mesh_xx, mesh_yy, mesh_z)

このように、散布図とその散布図をある一枚の平面で近似した場合の平面を格子で示しています。

まとめ

今回はpythonで3次元グラフを作成する方法について解説しました。

具体的には下記のグラフです。

  • 3次元散布図 ax.scatter(x, y, z)
  • 曲面 ax.plot_surface(X, Y, Z)
  • 格子点 ax.plot_wireframe(X, Y, Z)
  • 3次元散布図とその平面の傾き scatter()とplot_wireframe()の組合せ

もし、いくつかの変数を扱う際には、3次元グラフの採用も検討していただけると幸いです。

ここまでお読みいただき、ありがとうございました!

コメント

タイトルとURLをコピーしました