リアルタイム 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へのパスは適宜変更してください。
コメント
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。