matplotlibで3Dプロットをする方法

本記事ではmatplotlibを用いて3Dプロットする方法を説明します。

matplotlibの基本操作はこちら

matplotlibとは pythonを用いたグラフ描画ライブラリ。折線グラフやヒストグラム、3次元グラフなどさまざまなグラフをかける。   matplotlib、構文が分かりそうで分からない! 初めて[…]

 

 

はじめに

まずはインポート

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

1行目は3Dプロットのためのライブラリ、4行目はカラーマップを使うためのライブラリです。

 

3Dプロットでも2Dと同様にfigとaxを分けて生成する書き方と、fig, axをまとめて生成する書き方があります。

  • figとaxを分けて生成
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, projection='3d')

 

 

  • figとaxを同時に生成
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection' : '3d'})

 

これで土台ができたので、プロットを上乗せしていきます。

 

 

3Dプロット (Surface plots)

例えばは以下の関数を定義して曲面をプロットしてみます。

$$- \left( \cos{x} + 2\cos{\left(\frac{\sqrt{3}}{2}y\right)}  \cos{\left(\frac{x}{2}\right)}\right)$$

def func1(x, y):
return -(np.cos(x) + 2*np.cos(((3**0.5)/2)*y)*np.cos(x/2))
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={'projection' : '3d'})
x = np.arange(-10, 10, 0.1)
y = np.arange(-10, 10, 0.1)
X, Y = np.meshgrid(x, y) #メッシュグリッドの生成
ax.set_xlabel("k_x")
ax.set_ylabel("k_y")
ax.set_zlabel("E_t")
ax.plot_surface(X, Y, func1(X,Y) , cmap=cm.plasma)
plt.show()

 

4行目でメッシュグリッドの作成をしています。

これは、指定したx,yの値を(x,y)で張られた3次元の立体に格子点を作る作業になります。

この後、作成した格子点の上で、関数の値をプロットしていけばz軸の値が可視化できて3Dプロットが作成されます

 

また、plot_surface()には主に以下のような引数があります。

第1引数 X座標
第2引数 Y座標
第3引数 Z座標
rstride, cstride 軸上でプロットするステップ数の指定
cmap カラーマップの指定
alpha 透明度

 

例えばrstride、cstride引数を1に指定してみると以下のようになります。

fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={'projection' : '3d'})
x = np.arange(-10, 10, 0.1)
y = np.arange(-10, 10, 0.1)
X, Y = np.meshgrid(x, y) #メッシュグリッドの生成
ax.set_xlabel("k_x")
ax.set_ylabel("k_y")
ax.set_zlabel("E_t")
ax.plot_surface(X, Y, func1(X,Y), rstride=1, cstride=1, cmap=cm.plasma)
plt.show()

 

先と比べて曲面が滑らかになりました。

 

 

カラーバーの表示

カラーバーを表示するには、

fig.colorbar(グラフの名前, ax=ax, shrink=0.5)

というコードを追加します。引数については、

第1引数 カラーバーを設定したいグラフ
ax colorbarを設定したいaxオブジェクト
shrink カラーバーの大きさ

 

先ほどの関数にカラーバーを加えると以下のようになります。

fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={'projection' : '3d'})
x = np.arange(-10, 10, 0.1)
y = np.arange(-10, 10, 0.1)
X, Y = np.meshgrid(x, y) #メッシュグリッドの生成
ax.set_xlabel("k_x")
ax.set_ylabel("k_y")
ax.set_zlabel("E_t")
plot = ax.plot_surface(X, Y, func1(X,Y), rstride=1, cstride=1, cmap=cm.plasma)
fig.colorbar(plot, ax=ax, shrink=0.5)
plt.show()

 

 

 

グラフの回転

グラフを回転させるためには、次のようなメソッドを追加します。

ax.view_init(elev=20, azim=20)

引数elevは縦、azimは横方向の回転です。

 

fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={'projection' : '3d'})
x = np.arange(-10, 10, 0.1)
y = np.arange(-10, 10, 0.1)
X, Y = np.meshgrid(x, y) #メッシュグリッドの生成
ax.set_xlabel("k_x")
ax.set_ylabel("k_y")
ax.set_zlabel("E_t")
plot = ax.plot_surface(X, Y, func1(X,Y), cmap=cm.plasma)
fig.colorbar(plot, ax=ax, shrink=0.5)
ax.view_init(elev=0, azim=0)
plt.show()

 

縦、横の回転数を0度 (初期値) に設定するとこのようになります。ここから縦横方向に指定した度数分回転することができます。

fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={'projection' : '3d'})
x = np.arange(-10, 10, 0.1)
y = np.arange(-10, 10, 0.1)
X, Y = np.meshgrid(x, y) #メッシュグリッドの生成
ax.set_xlabel("k_x")
ax.set_ylabel("k_y")
ax.set_zlabel("E_t")
plot = ax.plot_surface(X, Y, func1(X,Y), cmap=cm.plasma)
fig.colorbar(plot, ax=ax, shrink=0.5)
ax.view_init(elev=20, azim=0)
plt.show()

縦に20度回転

 

 

まとめ

matplotlibを用いた3Dプロットの方法を解説しました。

今回はSurfaceプロットについて紹介しましたが、他にもWireプロットや棒グラフなど様々なプロットがあります。(参考

他のプロットについても、ax.plot~のメソッド名と引数が変わるだけで、動作の仕組みは同じです。

 

Programmingの最新記事8件