2012年7月15日日曜日

guiqwtのpyplotを使ったグラフ

guiqwtでpyplotを使ったグラフの作成。
matplotlibと同様にかけてストレスがない。
とりあえずメモ。
参考URLを見てもわかるように、機能としては最低限なので、今後はこれ以外のモジュールを模索していきたい。

参考:http://packages.python.org/guiqwt/reference.html#guiqwt-pyplot

import numpy as np
from guiqwt import pyplot as plt

x = np.linspace(-5, 5, 100)
plt.figure(1)
plt.subplot(2,1,1)
plt.plot(x, np.sin(x), "r+")
plt.ylabel("sin")
plt.subplot(2, 1, 2)
y = np.random.rand(len(x))
plt.plot(x, y)
plt.ylabel("random")
plt.show()






guiqwtとmatplotlib

これまでmatplotlibのグラフ機能を勉強してそれをGUIアプリケーションに応用しようと考えていました。matplotlibはとても有名で、資料も豊富なのですが、どうも僕の用途には向かないようです。なぜならグラフをsubplotとして複数(10枚~)表示さえると著しく速度が低下してしまう。データ処理して表示さえるだけならいいのですが、インタラクティブに操作するには大変問題となってしまいます。

OpenGLで開発するしかないか。。。と諦めかけていた矢先、qtの開発環境としてPython(x,y)をインストールしたら、guiqwtなるものを発見しました。しかもサンプル付きで、そのサンプルがとても魅力的。

これはと思ってサンプルをいじって、何枚かグラフを表示させると明らかにmatplotlibよりも速い。

guiqwtとはPyQwt(PyQt4のプロットウィジット)とnumpyやscipyを元にしたもので、効率のよい2Dプロットを実現してくれるもの、らしい。http://packages.python.org/guiqwt/overview.html

たとえば、最低限の機能なら同じように記述できる。
import guiqwt.pyplot as plt # only this line has changed!
import numpy as np
x = np.linspace(-10, 10)
plt.plot(x, x**2, 'r+')
plt.show()


でも、前に書いたみたいにfig.add_subplot(111)などはできなかった。
今後はPyQtの勉強も兼ねてこのguiqwtの勉強をしていこう。



2012年7月1日日曜日

matplotlib その4 マウスで座標の取得

matplotlibでマウスのボタンが押されたときの情報を取得するプログラム。

ここでの取得項目は左から、
押されたボタンの種類(1:右、2:ホイール、3:左)、
マウスの押された場所でのピクセル座標(x, y)
マウスの押された場所でのデータ座標(x, y)


参考URL:http://matplotlib.sourceforge.net/users/event_handling.html



from numpy.random import rand
from pylab import figure, show

def onclick(event):
    print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(
        event.button, event.x, event.y, event.xdata, event.ydata)

if __name__ == "__main__":
    fig = figure()
    ax = fig.add_subplot(111)
    ax.set_title("button pressed event demo")
    ax.plot(rand(5))

    fig.canvas.mpl_connect('button_press_event', onclick)
    show()