Matplotibを使ってグラフ描画するスクリプトは、PySideへそのまま移植したいと思っているので、pylabは使わず、pltとnpを使っていく.
import matplotlib.pyplot as plt import numpy as np
多くの初心者は、Matplotlibをwebアプリケーションサーバで利用するときにエラーが出て困っている。なぜなら、MatplotlibはGUIで使う事を前提としており、X11への接続が必要になるからである。しかし、Webサーバーでも簡単なおまじないで使う事はできる。matplotlib.pyplotを呼び出す前にmatplotlib.use('Agg')を宣言するのだ。これで、matplolibはバックエンドでのみ動作し、GUIを必要とせずグラフを描画する事ができる。
# do this before importing pylab or pyplot import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(111) ax.plot([1,2,3]) fig.savefig('test.png')
ax = fig.add_subplot(1,1,1) ax = fig.add_axes([0.15, 0.1, 0.7, 0.3]) : [left, bottom, width, height]
xtext = ax.set_xlabel(' frequency') ytext = ax.set_ylabel(' Amplitude')
for ax in fig.axes: ax.grid(True)
ax = gca() [xmin, xmax, ymin, ymax] = ax.axis() ax.axis([xmin, xmax, ymin, ymax]) ax.axis('off') ax.axis('scaled') ax.axis('tight') ax.axis('image') ax.axis('auto') ax.axis('normal')
plt.close('all') fig, ax = plt.subplots()
f, axarr = plt.subplots(2,2) axarr[0, 0].plot(x, y)
plt.subplot2grid( (5,5), (0,0), colspan=3) plt.subplot2grid( (5,5), (0,3), colspan=2) plt.subplot2grid( (5,5), (1,4)) plt.subplot2grid( (5,5), (1,0), colspan=4) plt.subplot2grid( (5,5), (2,0), colspan=5, rowspan=3)
subplotの中身について、tickables, axis, labels, titlesの大きさを、タイトなレイアウトにしてくれる
contour(Z) contour(Z, corner_mask=False, colors=(mpl_colors), alpha = (float), cmap=Colormap, NORM=Normalize, vmin=scalar, vmax=scalar, levels=[float], origin=['upper'|'lower'|'image'], extent=(x0,x1,y0,y1), locator=?, extend=補完?
contour(Z, cmap='hot')
→ Documenting the matplotlib colormaps
ガボールウェーブレットの結果をスペクトログラムの様に表示したいが、imshow()だと、縦横比がおかしくなったり、目盛が逆になったりして、1か月ぐらいはまっていた。そこで、matplotlib.specgramの中身を確認すると、imshow()を使っていることが分かった。前処理を含み参考にしてgwtspecgramを実装する。
サンプルコードを見ていると、titleの表示方法が2種類見られる。
fig = plt.figure() ax = fig.add_subplot(111) ax.set_title('axes title')
fig = plt.figure() ax = fig.gca() plt.title('axes title')
違いを調べるために、plt.title()の中身を確認したところ、中では同じset_title()が呼ばれていた。matlab風にするためのラッピングかもしれない。
def title(s, *args, **kwargs): l = gca().set_title(s, *args, **kwargs) draw_if_interactive() return l
Matplotlibでは、マウスクリックやドラッグ、キーボード操作に対するハンドラが実装されている。PySideやPyQt?のようなシグナル・スロットのようにconnectを使って、イベントを捕まえることができる。
# -- import matplotlib.pyplot as plt import numpy as np # -- fig = plt.figure() ax = fig.add_subplot(111) ax.plot(np.random.rand(10)) # -- def onclick(event): # Eventの基本プロパティ (matplotlib.backend_bases.Event) print event.name # イベント名 print event.canvas # FigureCanvasインスタンス print evnet.guiEvent # トリガーされたGUIイベント
# MouseEventのプロパティ print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%( event.button, event.x, event.y, event.xdata, event.ydata) # -- cid = fig.canvas.mpl_connect('button_press_event', onclick) plt.show()
line, = plt.plot(X) line.figure line.figure.canvas line.figure.canvas.draw() line.set_x(x1) line.set_y(y1) line.get_xdata() line.get_ydata() line.axes
event.name event.canvas event.guiEvent
event.x event.y event.xdata event.ydata event.inaxes
event.artist event.ind
line = event.artist xdata = line.get_xdata() ydata = line.get_ydata() ind = event.ind x0 = xdata[ind] y0 = ydata[ind]
カレントのaxesの最大値と最小値を取得する
xmin, xmax = plt.xlim() # return the current xlim plt.xlim( (xmin, xmax) ) # set the xlim to xmin, xmax plt.xlim( xmin, xmax ) # set the xlim to xmin, xmax
しかしこれだと、PySideでは使いづらい。中身をみると結局はgca()を使ってcurrentなaxesを取得してaxesのメソッドを呼び出している。
fig, ax = plt.subplot(111) xmin, xmax = ax.get_xlim() ax.set_xlim( xmin, xmax )