Pythonのグラフ描画ライブラリはmatplotlibが綺麗であまりにも有名ですが、動作は速くありません。もし高速なプロット動作が求められる場合はpyqtgraphで実現できます。使い方を知るために、ここではインストール方法とサンプルの見方を紹介します。
こんにちは。wat(@watlablog)です。
高速なプロットが可能なpyqtgraphをインストールする方法とサンプルの実行方法、コードの見方を紹介します!
pyqtgraphはmatplotlibよりも高速なプロットができる!
pyqtgraphとは?
pyqtgraphとはPyQtという様々なOSで動作するクロスプラットホームなGUIツールキットで使うグラフ描画ライブラリです。
当WATLABブログでは、GUIプログラミングとしてTkinterをオススメしていました。
正直今でも初心者にやさしいGUIプログラミングはTkinterだと思っています。何しろPython標準で使えて、Web上に情報が沢山あるので壁に当たりにくいです。
しかし、pyqtgraphはグラフのプロットが高速という所が優れたライブラリです。
通常の静的なグラフ描画であればそれほど恩恵を感じることは無いと思いますが、リアルタイムに信号をモニタする場合等、動的なグラフ描画が必要なプログラムには高速な描画が必須になります。
高速プロットが出来ない場合の問題
高速プロットってそこまで必要?待ってれば処理が完了するなら待つよ!
…といった疑問や意見もあると思いますが、待ってても処理が完了しないという例があります。
下の画像はPyAudioで録音し、何も考えずmatplotlibで毎フレームをグラフ描画していた時の図です。0.015[s]-0.02[s]の間で段差が発生しているのがわかります。
この段差はフレーム毎のグラフ描画がおそく、計測データにギャップが空いてしまったがために起こってしまった現象です。
このように、高速な処理が必要なプログラミングでは処理が遅いとデータの不備に繋がる事態になってしまいます。
pyqtgraphを使う環境構築をしよう!
では早速pyqtgraphを使えるように環境構築をしましょう!
といっても作業は簡単です。pipでインストールできてしまうので、僕と同じくWindowsユーザであればコマンドプロンプトを立ち上げましょう。
pipについては過去に「Pythonのパッケージ管理ツール pipの使い方とコマンド集」という記事を書きましたので、不安な方は是非参照してみて下さい!
ちなみに、僕のPCやPython環境は「Python入門!初心者がインストールから学習開始するまでの3ステップ」に記載していますので、何かうまくいかないといった場合はこの記事を読んでみて下さい。
PyQt5をインストールする
pyqtgraphは、PyQtというGUIツールキット上で動作します。そのためまず始めにPyQtをインストールしましょう。
2019年10月時点ではPyQt5が最新と思われますので、僕はこちらをインストールしました。特にこだわりがなければ最新を入れるのが自分流なのです。
pipコマンドは以下の文です。
1 |
python -m pip install PyQt5 |
pyqtgraphをインストールする
そして次にpyqtgraphをインストールします。
pipコマンドは次の通りです。
1 |
python -m pip install pyqtgraph |
これで必要なものは全て揃いました!
pyqtgraphのサンプルを起動してみる
サンプルを起動するPythonコード
PyQtとpyqtgraphのインストールが完了したら、いきなりコーディングするのでは無く、まずはサンプルを見てみましょう!
実はpyqtgraphの公式サイトにそのやり方が書いてあるのですが、たった2行のコードなので以下に示します。この文をPythonプログラミング環境で実行してみて下さい。
1 2 |
import pyqtgraph.examples pyqtgraph.examples.run() |
すると以下のウィンドウが開きます。
このウィンドウはpyqtgraphを用いた様々なサンプルの実行例を実際に動作させて見ることができ、さらにコードも閲覧・コピペできるというものです。
まず左のリストから①見たいサンプルを選択し、②「Run Example」でサンプルを実行します。ちなみに、左のリストからサンプルを選択した時点で右のテキストボックスにコードが表示されます。③コードを閲覧することで欲しい機能だけ抽出することもできますね。
以下の図は「Basic Plotting」を実行したものになります。
素晴らしい!かなり自由度の高いグラフが簡単にかけそうだ!
サンプルから必要な部分だけ抽出してみる
サンプルを実行し、思ったより色々なことが出来そうだということがわかりましたが、これだとただ作品を眺めているだけです。
実際に使うためにはここから必要なものだけ抽出してくるという作業が必要です。
先ほどの全コードから「Updating plot」を抽出してみたコードを以下に示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
from pyqtgraph.Qt import QtGui, QtCore import numpy as np import pyqtgraph as pg app = QtGui.QApplication([]) win = pg.GraphicsWindow(title="Basic plotting examples") win.resize(1000,600) win.setWindowTitle('pyqtgraph example: Plotting') pg.setConfigOptions(antialias=True) p6 = win.addPlot(title="Updating plot") curve = p6.plot(pen='y') data = np.random.normal(size=(10,1000)) ptr = 0 def update(): global curve, data, ptr, p6 curve.setData(data[ptr%10]) if ptr == 0: p6.enableAutoRange('xy', False) ## stop auto-scaling after the first data set is plotted ptr += 1 timer = QtCore.QTimer() timer.timeout.connect(update) timer.start(10) ## Start Qt event loop unless running in interactive mode or using pyside. if __name__ == '__main__': import sys if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QApplication.instance().exec_() |
ホントにただ抽出してきただけですが、このコードを実行すると以下の結果を得ます。
この図は静止画ですが、実際はかなり高速にデータが更新されていき目まぐるしく動いています。
こういうのがやりたかったんだよ!
まとめ
このページではmatplotlibより高速にプロットができるpyqtgraphを紹介しました。
高速なプロットはリアルタイム性を求めるプログラムでは非常に重要な要素になります。
pyqtgraphを使うには、PyQtとpyqtgraphの2つをインストールする必要がありますが、サンプルも充実しておりサンプルコードも簡単に閲覧することが出来ました。
まだまだ沢山のサンプルがあるので、是非皆さんも色々動かして遊んでみて下さい!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!
コメント