【Python】matplotlibでの3次元グラフ描画の方法とライブラリの使い方について

みなさん、こんにちは、
みむすたーです。

Pythonでデータ解析や数学の式を取り扱うときに、
3D空間上に曲線を表示させたくなることがあります。

今回は、3D空間上に曲線をmatplotlibを使用して、
表示させる方法について説明します。

それではいきましょう。

もくじ

サンプルコード

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

fig = plt.figure()

# x, y の2次元グリッドを作成する
ax = Axes3D(fig)

# 3次元グラフの式
x, y = np.meshgrid(np.linspace(-10,10,100),np.linspace(-10,10,100))

# 3次元グラフの式
z = np.sin(x) / x + np.sin(y) / y

#グラフをワイヤーフレーム形式で表現する
cs=ax.plot_surface(x,y,z,cmap="coolwarm")
ax.set_title("x-y-z曲線", fontname="MS Gothic")
ax.set_xlabel("x軸",fontname="MS Gothic")
ax.set_ylabel("y軸",fontname="MS Gothic")
ax.set_zlabel("z軸",fontname="MS Gothic")

plt.show()

出力結果

ソースコードの説明

8行目のax = Axes3D(fig)は、3Dグラフを作成するために必要なオブジェクトです。
引数の詳細な説明は以下のリンクから確認することができます。

https://matplotlib.org/api/_as_gen/mpl_toolkits.mplot3d.axes3d.Axes3D.html#mpl_toolkits.mplot3d.axes3d.Axes3D

今回は、Figureクラスのfigオブジェクトの指定のみを指定しました。
figオブジェクトを作成すると、以下のように何も描かれていない3次元グラフが表示されます。

11行目のnp.meshgrid関数でx,y座表面に等間隔にグリッド座標を生成します。
イメージとしては、以下のような感じです。

x,yのグリッド座標のイメージ図

上の青い点がmeshgridで生成したx,yのグリッド座標です。
次にz座標を決めていくために、x,yを使用してz座標を生成します。

meshgridの戻り値を代入した変数のx,yは2次元のリストになっています。
14行目の変数zへの代入では、z軸を決めています。

17行目のax.plot_surfaceで3次元グラフの種類を決定しています。
今回は、上ではsurface(面表現)プロットを行いましたが、
そのほかにもscatter(点表現)プロットやwireframe(線表現)などの種類があります。

wireframeでのプロット
scatterでのプロット

18行目以降は、ax.set_titleやax.set_xlabel、plt.colorbarなどで、
グラフのタイトルの設定、x軸の名前、カラーバーの表示を行います。

余談になりますが、一番最初に示したsurfaceプロットの図のように、
scatterプロットでもz軸方向の値によって色の変化をつけることもできます。

ただし、wireframeはできないようです。

コメント