Gnuplot のグラフを継続して更新する

A live plot with automatic updates by Gnuplot.

組込系の設計試作をしていると、いや、そうでない場合も、データを視覚化するためにプロットツールは必携かと思います。Excel で「ちまちま」とやる方もあるかと思いますが、コンピュータ技術者は Gnuplot などのスクリプト言語で自動化するのがお好みではないでしょうか。

Gnuplot は歴史が長くユーザーも多いので、「こんなことできないかなあ」と思うと、大抵のことが先達に解決されていて驚きます。ま、スクリプト構文的には決して美しい言語ではないと思いますが。

今日は、Gnuplot によるグラフの継続更新を考えていました。外部機器から入ってくるデータをリアルタイムにプロットしたい訳です。これも先達がいらして、ググったらこんなを見つけました。

Gnuplot には reread というコマンドがあるらしく、それを実行すると現在のスクリプトを頭から読み直してくれます。その場合、既存のグラフ画面を閉じて再度開く、ということはしないので、たとえば pause コマンドで 0.1秒スリープとかすると、だいたい 10フレーム/秒でリアルタイム更新できる、ということのようです。(Gnuplot の pause は、プラットフォームによっては小数点も指定できるらしい。)

もう一つの技は、Gnuplot のコマンドをパイプラインで与えるという方法です。(上述のサイトでもなんとなく匂わせていますが。)

たとえば、

$ echo 'plot sin(x); pause 1; plot cos(x); pause 1; plot sin(x)' | gnuplot

とかすると、雰囲気が分かるかと思います。

もう少し具体的に

もう少し具体的に、Python で Gnuplot を呼び出す方法を知りたいという方のために、簡単なスクリプトを書いてみました。KISS (Keep It Simple…) を標榜しているので、本当に簡単なスクリプトで御容赦ください。

import subprocess
p = subprocess.Popen(['gnuplot'], stdin=subprocess.PIPE)
p.stdin.write('set grid\n')
p.stdin.write('plot sin(x)\n')