本記事ではmatplotlibを用いて3Dプロットする方法を説明します。
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~のメソッド名と引数が変わるだけで、動作の仕組みは同じです。
コメントを書く