リアルタイム gnuplot

計算結果を結果が出次第、流れるようなグラフにしたい、そんなことがありました。そこでプログラムとグラフ描画ソフトのgnuplotをつないで、リアルタイムでグラフをかけないかということを考えてみました。

gnuplotへはパイプという方法で外部のプログラムからコマンドを流し込むことが可能です。
*NIXではpopen(プログラムパス、開くモード)、Windowsでは_popen(プログラムパス、開くモード)という関数を実行すると、指定したプログラムが起動し、かつそのプログラムへのパイプが開かれます。パイプといっても、関数の実行結果はファイルへのポインタ(FILE *)なので、あとはこれに対して指定したプログラムに送りたいデータをfprintfあたりで流し込んでやればOKです。終了したらpclose(*NIX)または_pclose(WIndows)でパイプを閉じましょう。
今回はプログラムパスがgnuplot、送り込むデータをgnuplotのコマンド、とすれば外部プログラムからgnuplotをコントロールすることが可能です。詳しくは『CのプログラムからGNUPLOTを動かす方法』を参考にしました。ありがとうございます。

流れるグラフですが、C++のアルゴリズムであるqueue(FIFO)と組み合わせれば簡単にできます。新しいデータが入ってくるたびに一番古いデータを追い出し、gnuplotを再描画すればいちおう流れるグラフを書くことが出来ました。あくまでもいちおうなので、データ量が多かったり、更新周期が早いと画面がちらつきます。gnuplotがそういうリアルタイム用途むけでないという話もあるのですが(笑)。

サンプルコードとしてgnuplot_test.cppをおいておきます。コンパイルには、C++からgnuplotのパイプを扱いやすくしたgnuplot.h、ならびにutil以下の一部のヘッダが必要だと思います。gnuplotへのパスは適宜変更してください。

November 24, 2005 17:33 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク

コメント

コメントする