PLplot でコマンドライン引数にデータファイルを指定する方法

最近 TeX に載せるグラフを書くために Numbers とか使って EPS に変換したりとかしてたのですが, よくある2段組み用に使うと汚くてかなり見づらい.

今日とうとう諦めて PLplot を使って描画プログラムを書くことにしました.

PLplot Home Page - Main

PLplot は pgplot みたいなグラフ生成用のミドルウェアです.

バインディングは C, C++, Python, Fortran など.

EPS で出力すると結構奇麗な表示になって大変良いと思います.

ただ C++ の example が大変残念だったり, 凡例表示用関数が引数30超えてるとか*1まあ色々不満はあるのですが, ベタで書くよりは楽だろうと思います.

僕はいちいちデータファイルを変更するためにコンパイルし直したくないのでコマンドライン引数に渡したかったのですが, PLplot にオプション解析を乗っ取られているのでどうすれば良いのかと思ってたのですが, なんとなく調べても出てこなかったので一応メモ.

plparseopts 関数が引数を解析しますが, サンプルだと PL_PARSE_FULL だけが渡されているのが多いと思います.

ここに | で PL_PARSE_SKIP を指定すれば PLplot が解析できない引数をスキップできます. スキップしないとエラー出力で落ちます.

plparseopts 関数を通った後, argc, argv の内容は変更され, PLplot が認識した引数は全て削除されます. なので PLplot のオプションだけを渡せば, argc は 1 になります.

グラフに使用するデータファイルをコマンドライン引数に指定させようとすると, こういう書き方になります.

int main(int argc, const char** argv) {
  plparseopts(&argc, argv, PL_PARSE_FULL | PL_PARSE_SKIP);

  if(argc != 2) {
    std::fprintf(stderr, "[Usage] %s <PLplot options...> data-file\n", argv[0]);
    return -1;
  }

  const std::string dataFile = argv[1];

  ...
}

PLplot はちゃんと設定すれば Numbers で描画したグラフと遜色ないぐらい奇麗なグラフを EPS で出力できるので, TeX 使う人には便利だと思います.

Ruby のバインドがあれば良いなあとは思いました.

*1:[http://plplot.sourceforge.net/docbook-manual/plplot-html-5.9.9/pllegend.html:title]