Matplotlib - izudon/izudon.github.io GitHub Wiki
- ゼロから作る Deep Learning の 練習用コード から理解できる範囲のことをまとめてみた。
基本の流れ:
- x(定義域)に配列、y に「取った値」の配列を格納(y は複数種類でも良い)
- plot 命令(同時に、ラインスタイル(実線・破線等)、ラベルなどの指定)
- 軸、軸ラベル、標題、凡例などの指定
- 描画(画面またはファイルへの出力)
# coding: utf-8
import numpy as np
import matplotlib.pyplot as plt
# データの作成
x = np.arange(0, 6, 0.1) # 0から6まで0.1刻みで生成
y1 = np.sin(x)
y2 = np.cos(x)
# グラフの描画
plt.plot(x, y1, label="sin") # label -> 凡例などで拾われる
plt.plot(x, y2, linestyle = "--", label="cos") # 破線
plt.xlabel("x") # x軸のラベル
plt.ylabel("y") # y軸のラベル
plt.ylim( -1.1, 1.1 ) # y軸の描画範囲
plt.title('sin & cos') # 標題
plt.legend() # 凡例
plt.show()
- matplotlibで3Dグラフを描画する - white wheelsのメモ が参考になる。
- てかこんな大事なこと コードの隅 なんかにさらっと書かんでくれ。
- x と y(定義域)を配列で用意する。
x = np.arange(-3, 3, 0.25) y = np.arange(-3, 3, 0.25)
- 定義域配列を行列に変換する。
x を 行ベクトルとみて縦方向に y の要素数分並べた(だけの)行列 X と
y を 列ベクトルとみて横方向に x の要素数分並べた(だけの)行列 Y 。
NumPy はベクトル演算を基本「要素毎」に処理するので、
定義域の (x, y) を全種類用意できるよう縦横に展開する。X, Y = np.meshgrid(x, y)
- 取った値を格納する。2次元配列である。
Z = np.sin(X)+ np.cos(Y)
- あとはプロット。
fig = plt.figure() ax = Axes3D(fig) ax.plot_wireframe(X,Y,Z)
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-3, 3, 0.25)
y = np.arange(-3, 3, 0.25)
X, Y = np.meshgrid(x, y)
Z = np.sin(X)+ np.cos(Y)
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_wireframe(X,Y,Z) #<---ここでplot
plt.show()
- これ よく読む。
-
plt.quiver(X,Y,U,V,**kw)
がベクトル場を描画する関数。
x0 = np.arange(-2, 2.5, 0.25)
x1 = np.arange(-2, 2.5, 0.25)
X, Y = np.meshgrid(x0, x1)
X = X.flatten()
Y = Y.flatten()
grad = numerical_gradient(function_2, np.array([X, Y]).T).T
plt.figure()
plt.quiver(X, Y, -grad[0], -grad[1], angles="xy", color="#666666")
plt.xlim([-2, 2])
plt.ylim([-2, 2])
plt.xlabel('x0')
plt.ylabel('x1')
plt.grid()
plt.draw()
plt.show()
- 仮想サーバなどで Matplotlib を動かしていて画面には出せない場合などに。
- ホストマシンで X を動かせばいいじゃないかという議論はおいておく。
- ズバリ
plt.show()
のかわりにplt.savefig('<filename>')
を呼び出す。 - ただし
matplotlib.pylab
をimport
する前段でmatplotlib.use('Agg')
しておく。- なんでもこれは「バックエンドの指定」をしているらしく、
バックエンドの指定はmatplotlib.pylab
がimport
される前にやらないと
後だと既に指定されてしまっているとのことだ(エラーメッセージによれば)。
- なんでもこれは「バックエンドの指定」をしているらしく、
import numpy as np
import matplotlib
matplotlib.use('Agg') #-- これ
import matplotlib.pylab as plt
:
:
plt.plot( x, y )
plt.ylim( -0.1, 1.1 )
plt.savefig( 'a.svg' ) #-- ここでファイルに吐かれる
- 出力されたファイルはホストマシンからブラウザで確認する(僕の場合)。
$ python3 -m http.server 8888 &
- ファイル形式は png, svg, pdf などから選択できる。
出力指定したファイル名の拡張子から自動判別している。
解像度などをオプションで指定できる。
plt.plot(y)
plt.savefig('out_graph.png', dpi=300, orientation='portrait', transparent=False, pad_inches=0.0)
plt.savefig('out_graph2.pdf', orientation='portrait', transparent=False, bbox_inches=None, frameon=None)
plt.show()