プログラミングメモ

1. Cプログラムからgnuplotを操作する

計算結果の分析において、データのグラフ化は欠かせない。 しかし、試行錯誤によるパラメータの調整等でグラフ化を何度も行う場合、この工程は非常に面倒である。 gnuplotは研究者達に一般的に使用されるグラフ化ソフトであり、コマンド入力によって操作可能だ。 このgnuplotをCプログラムから操作することにより、自動的なデータのグラフ画像化を実現する。

.1 gnuplotの準備

gnuplotは2次元及び3次元のグラフを作成するためのコマンドラインアプリケーションソフトである。
以下のサイトから無料でダウンロードできる。
中段 Download from SourceForge より
windows用最新版 gp460win32.zip (2012.11時点)をダウンロード。

http://www.gnuplot.info/

Cプログラムでの場所指定を容易にするために、解凍した"gnuplot"フォルダをCドライブ直下へ移動しておく。

.2 サンプルプログラム

次のサンプルプログラムは、テキストデータの生成とgnuplotによるデータのグラフ化を行っている。
プログラム内でCos波のサンプリングデータをテキストデータで出力し、 gnuplotを操作して、出力したテキストデータと、比較するSin波をグラフ化する。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
	FILE *fp; //データファイル用ファイルポインタ
	FILE *gp; //gnuplot用ファイルポインタ
	char *src; //ルートフォルダ指定用
	double i;

/****** テキストデータの作成 ***************************************************************/
	
	fp = fopen("C:\\Data\\Data.txt", "w");  // ファイルを書き込み用に開く
	if (fp == NULL) {					// オープンに失敗した場合
		printf("cannot open\n");        // エラーメッセージを出して
		exit(1);                        // 異常終了
	}
  
	for(i=0;i<=6.0;i+=1.0)
		fprintf(fp, "%lf	%lf \n",i,cos(i)); // データの書き込み

	fclose(fp);
	
/****** gnuplotの操作 ***************************************************************/

	gp=_popen("C:\\gnuplot\\binary\\pgnuplot.exe","w"); //GNUPLOTを書き込みモードで開く

	src ="C:\\\\Data"; //ルートフォルダの場所の指定

	fprintf(gp,"set title \"Sine curve and output data\" \n");	//タイトルの設定
	fprintf(gp,"set xrange [0.0:6.0]\n");			//xの範囲
	fprintf(gp,"set yrange [-1.5:1.5]\n");			//yの範囲
	fprintf(gp,"set key top left \n");				//凡例の位置
	fprintf(gp,"set xl \"x\"\n");				//x軸の名前
	fprintf(gp,"set yl \"y\"\n");				//y軸の名前
	fprintf(gp, "set terminal png\n");				//画像出力の準備
	
	fprintf(gp, "plot sin(x) w l title 'Sin(x)' lw 2\n",src); //通常のsin波のプロット

	fprintf(gp, "set output '%s\\\\OutputImage.png'\n",src); //最後のplotの直前に記述
	//テキストデータのプロット
	fprintf(gp, "replot '%s\\\\Data.txt'using 1:2 w l title 'OutputData' lw 2\n",src);
	fprintf(gp, "set output\n");

	_pclose(gp);
}

_popenはパイプを作成してコマンドを実行する関数であり、引数にpgnupot.exeの場所を指定する。 pgnuplot.exeは標準入力から受けたコマンドをwgnuplot.exe のテキストウィンドウにパイプして渡すことができる。
コマンドの入力はfprintfを用いる。
ここで注意が必要で、"や\は文字列内では直接使用することが出来ないため、\"や\\と記述する。

これによって次のようなグラフ画像が得られる。

他にも、グラフ画像を並べて表示するhtmlファイルの生成等、工夫次第で更なる効率化が可能だ。

HOME > プログラミングメモ > 1. Cプログラムからgnuplotを操作する