gnuplot をC/C++から使う方法

工藤俊亮(東大池内研)

1.gnuplot

この文書では,gnuplot のバージョンは,4:0 を想定しています。4:0 では3 次元グラフの視点をマウスでグリグリ動かせたり,2 次元グラフでもズーム イン・ズームアウトとかがマウスで出来たりしてかなり快適です。ネットか ら取ってくる場合は,
http://www.gnuplot.info/からダウンロードできま す。Linux でコンパイルする場合,./configure,make,make install で OK です。Windows 版もあります(gp400win32.zip)。

C/C++からWindows 版のgnuplot を使う場合は,wgnuplot.exe ではな く,pgnuplot.exe を使うようにして下さい。これはwgnuplot.exe をパイプ 対応にしたもので,gp400win32.zip の中に入っています。

1.C/C++から使う

gnuplot は標準入力からコマンドを読み込んで実行するようになっている ので,popen() でパイプをつないでしまえば,あとはfputs() とかでコマン ドをパイプ書き出せばOK です。

Linux で使う場合は,次のような感じでいけます。gnuplot をパイプから使 う場合,最初にset mouse をしておかないと開いたウィンドウでマウスが使 えないみたいです。

パイプを用いた gluplot の制御
#include <iostream> 
#include <cstdio> 
using namespace std; 

int main() 
{ 
  FILE *fp = popen("gnuplot", "w"); 
  if (fp == NULL) 
    return -1; 
  fputs("set mouse\n", fp); 
  fputs("plot sin(x)\n", fp); 
  fflush(fp); 
  cin.get(); 
  pclose(fp); 
  return 0; 
} 

Windows(Visual C++)で使う場合は,popen(),pclose() 関数ではな く_popen(), _pclose() 関数を使います。それから最初にset mouse を実行 しなくても,マウスが有効になっているみたいです。ということで,VC で はこんな感じでいけます。
Visual C++ からの制御
#include <iostream> 
#include <cstdio> 
using namespace std; 

int main() 
{ 
  FILE *fp = _popen("pgnuplot.exe", "w"); 
  if (fp == NULL) 
    return -1; 
  fputs("plot sin(x)\n", fp); 
  fflush(fp); 
  cin.get(); 
  _pclose(fp); 
  return 0; 
}

3.Gnuplot クラスを作ってみました

上記のような感じでC/C++からgnuplot を使うのは簡単なのですが,もう 少し便利に使えるようにGnuplot クラスを作ってみました。いちおうウリは 次のような感じです。
  • Linux gcc,Visual C++,cygwin gcc のどれでもコンパイル可能。
  • std::vector に入ったデータをそのままプロットできるメソッドがある。
以下の場所に置いておくので,よろしければ使ってみて下さい。
http://www.cvl.iis.u-tokyo.ac.jp/~kudoh/gnuplot_class.tar.gz

クラスの本体は,gnuplot.cpp,gnuplot.h です。簡単なものですがマニュ アルっぽいものが入っています。また,サンプルプログラムも入っています。

これを使うと,sin 関数のグラフを表示するのは次のようになります。

Gnuplot クラスの使い方
  Gnuplot gp; 
  gp.drawFunction("sin(x)"); 

またstd::vector の要素もサクッとプロットできます。
std::vector のグラフ化
  vector v1(50); 
  ... 
  gp.plotX(v1, "v1"); 

(x; y) をプロットするGnuplot::plotXY() メソッドや,3 次元のプロットを するGnuplot::plot3DXYZ() もあります。

バグとかアドバイスとかありましたら,メールでお知らせ下さい。(July, 2004)