Python 2変数のグラフ mpl_toolkits.mplot3d Axes3D

こんにちは。レモンティーです。

以前平面のグラフを描画しましたが
sawalemounity.hatenablog.com


今回は2変数の立体のグラフを描画します。
mpl_toolkits.mplot3d の Axes3Dの
plt_surface(a,b,y)を使えば
2変数a,bと出力yのグラフを書くことができます。

具体的にはこんな感じです

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

def f4(x0,x1):
    return x0**2+x1**2

x0 = np.linspace(-4,4,20)
x1 = np.linspace(-4,4,20)
xx0,xx1 = np.meshgrid(x0,x1)

y = np.zeros((len(x0),len(x1)))
for i0 in range(len(x0)):
    for i1 in range(len(x1)):
        y[i0,i1] = f4(x0[i0],x1[i1])
        
plt.figure(figsize=(5,3.5))
ax = plt.subplot(1,1,1,projection='3d')
ax.plot_surface(xx0,xx1,y)
ax.view_init(60,40)
plt.show()

f:id:sawalemontea:20180313100648p:plain


from mpl_toolkits.mplot3d import Axes3D
は上の二つと書き方が違いますがimportしています。
こうするとライブラリ名を書かずに関数名だけで使用できます。

続いて
x0 = np.linspace(-4,4,20)
x1 = np.linspace(-4,4,20)
で一列分つくって
xx0,xx1 = np.meshgrid(x0,x1)
でx1は片方を縦にして平行にコピーします。
これでxx0とxx1で二次元の座標を表せます。
すごく雑にイメージすれば
f:id:sawalemontea:20180313100023p:plain
ループの所は各座標での出力をyに格納します。
(この作業は一列分で十分なのでx0,x1でやっていますが
y[i0,i1] = f4(xx0[i0,i1],xx1[i0,i1])でも同等です)

次に
ax = plt.subplot(1,1,1,projection='3d')
で三次元のグラフと指定
ax.plot_surface(xx0,xx1,y)
でセットして
ax.view_init(60,40)
で見る角度を決めます。(縦、横)

これで先ほどの画像のようなグラフが出力されます。

今回はこれでおしまいです。
sawalemounity.hatenablog.com