今までGtk+-2.0,gthread-2.0とCで書いていたGPIBを使った測定プログラム,さすがに時代遅れ感が否めないのでGtk+-3.0に書き換えました。
どうせ書き換えるならPythonにしてしまえばいいのですが,細かいことが気になってなかなか踏み切ることができずにいます。
その一つがリアルタイムグラフ表示。
Pythonでグラフといえばmatplotlibなのですが,いまいち遅い。
データ点がふえてきたときに負荷が大きくなる気がしています。
点が増えるたびにnumpyでいちいち丸ごとデータファイルから配列をつくって,プロットしたら測定して。。。を同じプロセスの中でやったら,測定まで遅くならないか心配で。
その点,今はCからパイプでgnuplotを呼び出して,別プロセスでグラフを書かせているので,たとえグラフ処理が遅くなったとしても,測定は別プロセスの別スレッドで回っているので,影響は少ないかと思っています。
それをpythonでやるならsubprocessをimportしてPIPEでgnuplotを呼び出して同じことをすればいいのですが,先人の知恵がないかとぐぐっていると,どうやらGnuplot.pyとかpy-gnuplotとか,そういったパッケージがあることを見つけたので,試してみました。
Gnuplot.pyは古かったので,py-gnuplotをためすことに。
環境としては,macOS BigSurとxubuntu22.04。
それぞれPythonのバージョンは3.10.9と3.10.6。
まずは
$ pip3 install py-gnuplot
でインストール。
% python3
Python 3.10.9 (main, Dec 15 2022, 18:33:08) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from pygnuplot import gnuplot
>>> g=gnuplot.Gnuplot()
>>> g.cmd('plot sin(x)')
>>> g.cmd('set xlabel "Temperature [K]"')
>>> g.cmd('replot')
>>>
g=gnuplot.Gnuplot()でgnuplotを起動して,g.cmd()でgnuplotに送りたいコマンドを送ると,gnuplotをコマンドラインでつかっているのとほとんど同じ感覚で使えます。
Pythonぽく使いたかったら,
>>> command='set ylabel "Resistance [Ohm]"'
>>> g.cmd(command)
>>> g.cmd('replot')
>>>
のようにすることもできる。
>>> g.cmd('set xlabel font "Arial,20"')
>>> g.cmd('set ylabel font "Arial,20"')
>>> g.cmd('set xtic font "Arial,16"')
>>> g.cmd('set ytic font "Arial,16"')
>>> g.cmd('replot')
>>>
いくらでも調整できます。