こんにちは。レモンティーです。
以前平面のグラフを描画しましたが
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()
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で二次元の座標を表せます。
すごく雑にイメージすれば
ループの所は各座標での出力を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