FrontPage / Python / Matplotlib

** スタイルの変更 [#ed158bb9]
- http://qiita.com/eriksoon/items/b93030ba4dc686ecfbba

 plt.style.use('dark_background')
 plt.style.use('ggplot')


** subplot同士で軸の共有 [#w81e2134]
#prettify{{
 fig = plt.figure()
 ax1 = fig.add_subplot(121)
 ax2 = fig.add_subplot(122, sharey=ax1)
}}

** plotのラインカラー [#z76e86ba]
#prettify{{
plt.plot(frange_khz, 20 * np.log10(data), c='gray', linewidth=0.5)
}}
- [[→axis_limit_selecter.py>https://gist.github.com/peace098beat/87aa1b98d611ba88d8ab]]

-- figureの横に小さなヒストグラムを表示し、グラフのlim()を設定するウィジェット

#ref(axis_limit_selector.jpg,,50%)

** ドキュメント [#o3ab97a0]

[[→継承関係図>https://fossies.org/dox/matplotlib-1.4.3/classmatplotlib_1_1contour_1_1QuadContourSet.html]]

[[→公式リファレンス>http://turbare.net/transl/scipy-lecture-notes/intro/matplotlib/matplotlib.html]]

[[→docs>http://matplotlib.org/contents.html]]

[[→User's Guide>http://matplotlib.org/users/index.html]]

[[→Beginner’s Guide>http://matplotlib.org/users/beginner.html]]

[[→Advanced Guide>http://matplotlib.org/users/developer.html]]

** モジュールのインポート [#sce15176]
Matplotibを使ってグラフ描画するスクリプトは、PySideへそのまま移植したいと思っているので、pylabは使わず、pltとnpを使っていく.

#prettify{{
 import matplotlib.pyplot as plt
 import numpy as np
}}

** webアプリケーションとしてグラフを保存する [#d73228cb]

多くの初心者は、Matplotlibをwebアプリケーションサーバで利用するときにエラーが出て困っている。なぜなら、MatplotlibはGUIで使う事を前提としており、X11への接続が必要になるからである。しかし、Webサーバーでも簡単なおまじないで使う事はできる。matplotlib.pyplotを呼び出す前にmatplotlib.use('Agg')を宣言するのだ。これで、matplolibはバックエンドでのみ動作し、GUIを必要とせずグラフを描画する事ができる。

[[→How-To-Matplotlib-Figure>http://matplotlib.org/faq/howto_faq.html#plotting-howto]]

#prettify{{
# 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')
}}

** axes handler[#jb102e49]

 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)

** figure [#g2be3270]
[[→matplotlib.figure>http://matplotlib.org/api/figure_api.html]]

[[→1.4.3.1 Figuresの使い方>http://turbare.net/transl/scipy-lecture-notes/intro/matplotlib/matplotlib.html#figures]]

 fig = plt.figure(figsize=(1,5), dpi=72, facecolor=[0,0,0], edgecolor=None, linewidth=0.0)
 class matplotlib.figure.Figure(figsize=None, dpi=None, facecolor=None, edgecolor=None, linewidth=0.0, frameon=None, subplotpars=None, tight_layout=None)
 fig = plt.figure(figsize=(10,2), dpi=72, facecolor=[1,1,1], edgecolor=[0,0,0], linewidth=1.0, frameon=False,  tight_layout=False)

 num: figureの数
 figsize: figureのサイズ(width, height)単位はインチ
 dpi: ドット/インチ
 facecolor: 描画背景色
 edgecolor: 縁の色
 frameon: (bool) figureのフレームを描画するかどうか

 
 

** axes [#m9552554]
[[→matplotlib.pyplot.axis()>http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.axis]]

 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')

** grid [#u605ac4d]

 ax.grid()

** fiugre, axes handles[#f171971a]

 plt.close('all')
 fig, ax = plt.subplots()

[[→Artist>http://matplotlib.org/1.3.0/users/artists.html]]

** subplots [#kf4bf407]

[[→subplots_demo.py>http://matplotlib.org/examples/pylab_examples/subplots_demo.html#pylab-examples-example-code-subplots-demo-py]]

[[→subplotsの使い方(ipython)>https://gist.github.com/peace098beat/649a58647993d96158a6]]

 f, axarr = plt.subplots(2,2)
 axarr[0, 0].plot(x, y)

** subplot2grid [#de3afb13]

 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)

** オブジェクト [#n9ff3de1]
#ref(Refference-matplotlib.pyplot.py)

- [[matplotlib.axes.axes>http://matplotlib.org/api/axes_api.html]]
- [[matplotlib.lines>http://matplotlib.org/api/lines_api.html#module-matplotlib.lines]]

- matplotlib.lines
-- class matplotlib.lines.Line2D(xdata, ydata,...)
-- class matplotlib.lines.VertexSelector(line)
-- matplotlib.lines.segment_hits(cx, cy, x, y, radius)



** fig.tight_layout() [#o2c92f56]
subplotの中身について、tickables, axis, labels, titlesの大きさを、タイトなレイアウトにしてくれる

[[→Tight Layout guide>http://matplotlib.org/1.4.1/users/tight_layout_guide.html]]

#ref(s-tight_layout0.jpg)
#ref(s-tight_layout1.jpg)

** Contour [#p5c671a5]

[[pyplot.contour>http://matplotlib.org/devdocs/api/pyplot_api.html#matplotlib.pyplot.contourf]]

 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')

**Colormap [#ebd62f48]

[[pyplot.Colormap>http://matplotlib.org/devdocs/api/colors_api.html#matplotlib.colors.Colormap]]

#ref(mpl_cmap.png,,20%)

[[→ Documenting the matplotlib colormaps>https://gist.github.com/endolith/2719900]]

** matplotlib.specgram [#l60e827c]
ガボールウェーブレットの結果をスペクトログラムの様に表示したいが、imshow()だと、縦横比がおかしくなったり、目盛が逆になったりして、1か月ぐらいはまっていた。そこで、matplotlib.specgramの中身を確認すると、imshow()を使っていることが分かった。前処理を含み参考にしてgwtspecgramを実装する。

[[→matplotlib.specgram>https://gist.github.com/peace098beat/9812bd04612a3f656abc]]

#ref(figure_specgram.png,,noimg,30%)
#ref(figure_scarogram.png,,around,right,30%)

** タイトル title() [#b1ceeae7]
サンプルコードを見ていると、titleの表示方法が2種類見られる。

- Basic text commands

 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風にするためのラッピングかもしれない。

- plt.title()

 def title(s, *args, **kwargs):
    l =  gca().set_title(s, *args, **kwargs)
    draw_if_interactive()
    return l

** 軸ラベル [#c7cdacd0]

 plt.plot( [3,1,4,1,5,9,2,6,5], label = "Data 1")
 plt.plot( [3,5,8,9,7,9,3,2,3], label = "Data 2")
 plt.legend() # 凡例を表示
 plt.title("Graph Title")
 plt.xlabel("X-axis")
 plt.ylabel("Y-axis")
 plt.show()

* Matplotlib イベントハンドラ [#h9f7fc01]
Matplotlibでは、マウスクリックやドラッグ、キーボード操作に対するハンドラが実装されている。PySideやPyQtのようなシグナル・スロットのようにconnectを使って、イベントを捕まえることができる。

[[→Event handling and picking>http://matplotlib.org/users/event_handling.html]]

** イベントの接続 (mpl_connect) [#w57087dd]

 # --
 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()

** イベントハンドラでfigure,axesの呼び出し [#a939a3c2]

 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 handling and picking>http://matplotlib.org/users/event_handling.html#event-handling-and-picking]] [#j5dc95fb]

- [[Event name	Class and description>http://matplotlib.org/users/event_handling.html#event-connections]]
-- ‘button_press_event’	MouseEvent - mouse button is pressed
-- ‘button_release_event’	MouseEvent - mouse button is released
-- ‘draw_event’	DrawEvent - canvas draw
-- ‘key_press_event’	KeyEvent - key is pressed
-- ‘key_release_event’	KeyEvent - key is released
-- ‘motion_notify_event’	MouseEvent - mouse motion
-- ‘pick_event’	PickEvent - an object in the canvas is selected
-- ‘resize_event’	ResizeEvent - figure canvas is resized
-- ‘scroll_event’	MouseEvent - mouse scroll wheel is rolled
-- ‘figure_enter_event’	LocationEvent - mouse enters a new figure
-- ‘figure_leave_event’	LocationEvent - mouse leaves a figure
-- ‘axes_enter_event’	LocationEvent - mouse enters a new axes
-- ‘axes_leave_event’	LocationEvent - mouse leaves an axes

*** [[Event bases>http://matplotlib.org/users/event_handling.html#event-attributes]] [#p1042009]

 event.name
 event.canvas
 event.guiEvent

*** [[Mouse Event>http://matplotlib.org/users/event_handling.html#draggable-rectangle-exercise]] [#pcc28e3c]
 
 event.x
 event.y
 event.xdata
 event.ydata
 event.inaxes
 

*** [[pick event>http://matplotlib.org/users/event_handling.html#simple-picking-example]] [#qcb313b5]

 event.artist
 event.ind

 line = event.artist
 xdata = line.get_xdata()
 ydata = line.get_ydata()
 ind = event.ind
 x0 = xdata[ind]
 y0 = ydata[ind]

* 軸の設定 [#f88d8f7f]
** xlim, ylim [#h3f78fde]

カレントのaxesの最大値と最小値を取得する

[[→matplotlib.pyplot.xlim()>http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.xlim]]

 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のメソッドを呼び出している。

[[→matplotlib.axes.get_xlim()>http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.get_xlim]]

 fig, ax = plt.subplot(111)
 xmin, xmax = ax.get_xlim()
 ax.set_xlim( xmin, xmax )

** 目盛の設定 [#w3d7f234]

 # 目盛を消す
 ax2.set_xticklabels([])
 ax2.set_yticklabels([])

    plt.locator_params(nbins=25, axis='x', tight=True)
    plt.locator_params(nbins=10, axis='y', tight=True)

* clim [#sf0b7f93]
[[→Image tutoriall>http://matplotlib.org/users/image_tutorial.html#examining-a-specific-data-range]]

定義は以下

  AxisImage.set_clim()

通常のaxesにはset_climは存在しない。axesハンドルからAxisImageオブジェクトを取得するには
 
 #        for im in ax1.get_images():
            # ax1.set_clim(ax2.get_ylim())
            im.set_clim(ax2.get_ylim())

 imgplot = plt.imshow(img)
 imgplot.set_clim(0, 0.7)

** contourfの場合 [#a9caa6a6]

 cf = contourf(X,Y,Z)
 cmin, cmax = c.get_clim()

** Matplotlib Style Sheet (スタイルシート) [#q1f51f5b]
- [[A sample matplotlibrc file>http://matplotlib.org/1.3.1/users/customizing.html]]

** ピーク検出 [#i2c6bc3a]
        ''' ピークをプロット Scipyでピーク検出 '''
        from scipy import signal
        # 極大値検索
        maxId = signal.argrelmax(Pdata_ave, order=10, mode='wrap')
        maxId = maxId[0][:]
        self.axes.hold(True)
        self.axes.plot(self.plot_frange[maxId], Pdata_ave[maxId], 'ro')
        self.axes.hold(False)
        for id in maxId:
            s = '%0.1f' % (self.plot_frange[id])
            self.axes.annotate(s, xy=(self.plot_frange[id], Pdata_ave[id]), fontsize=10,
                               horizontalalignment='center', verticalalignment='bottom')

** GWTグラフのTips [#p0566f52]
    # def imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None,
    #            vmin=None, vmax=None, origin=None, extent=None, shape=None,
    #            filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None,
    #            hold=None, **kwargs):
    #


#ref(figure_1.png,,30%)
なぜかわからないが、そのまま使うと外側に空白ができる。

    gdata = 20*np.log10(gwt.T)
    extent = t[0], t[-1], f[0], f[-1]
    plt.imshow(gdata, cmap='jet', extent=extent, origin='lower', interpolation='nearest')
    plt.axis('auto')

#ref(figure_2.png,,30%)
axis('tight')を使うことで綺麗に表示された。
    gdata = 20*np.log10(gwt.T)
    extent = t[0], t[-1], f[0], f[-1]
    plt.imshow(gdata, cmap='jet', extent=extent, origin='lower', interpolation='nearest')
    plt.axis('tight')
トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS