電子書籍の厳選無料作品が豊富!

LINUX上のCからgnuplotを用い、適当なデータを作成し、グラフを1枚作成することに成功しました。今後はループ処理によって、データ名とグラフ名を替えながら大量のデータ処理をするつもりです。 gnuplotに送りこむデータ名の変更の仕方、グラフ名の変更の仕方を教えてください。

'out.data','out.png'を書き換える方法です。例えば’out1.data'から'out1000.data'。'out1.png'から'out1000data'のようにできれば、1000個のデータを処理し1000枚のグラフを作成できます。

下記に適当なグラフを出力するプログラム例を示します。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void){
FILE *data, *gp
char *data_file;
int i;
double x,y;

//make data file
data_file="out.data";
data = fopen(data_file,"w");

for(i=0;i<=5;i++){
x=i;
x=i*i;
fprintf(data,"%f\t%f\n",x,y);
}
fclose(data);

//make graph
gp=popen("gnuplot -persist","w");
fprintf(gp,"set terminal png\n");
fprintf(gp,"set xrange [0:5]\n");
fprintf(gp,"set yrange [0:50]\n")
fprintf(gp,"set output 'out.png'\n");
fprintf(gp,"plot \"%s\"with lines linetype 1 \n", data_file);
pclose(gp);
return(gp);
return 0;
}

A 回答 (4件)

ん~... そこまでできてて, なにで困っているんだろう.... 単純には


FILE *gp = popen("gnuplot -persist","w");
fprintf(gp,"set terminal png\n");
fprintf(gp,"set xrange [0:5]\n");
fprintf(gp,"set yrange [0:50]\n");
for (int i = 0; i < てきとうなところ; i++) {
char data_file[いくつか];
sprintf(data_file, "out%d.data", i);
FILE *data = fopen(data_file, "w");
/* データファイルに出力するところは全部ばっさり省略 */
fclose(data);
fprintf(gp, "set output 'out%d.png'\n", i);
fprintf(gp,"plot \"%s\"with lines linetype 1 \n", data_file);
}
pclose(gp);
でいいと思うんだが, なにかおかしなところはあるのかな?

この回答への補足

いろいろ試したところ、for文によって複数のpngファイルを作成することができました。いろいろ教えていただきありがとうございました。下記のプログラムでなんとか動きます。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void){
int i,j;
double x,y;

FILE *gp = popen("gnuplot -persist","w");
fprintf(gp, "set terminal png\n");
fprintf(gp, "set xrange [0:5]\n");
fprintf(gp, "set yrange [0:50]\n");

for(i = 0;i <= 3; i++) {
char data_file[32];
sprintf(data_file,"out%d.data",i);
FILE *data = fopen(data_file,"w");
for(j=0;j<=5;j++) {
x = j;
y = i*j*j;
fprintf(data,"%f\t%f\n",x,y);
}
fclose(data);
fprintf(gp, "set output 'out%d.png'\n",i);
fprintf(gp, "plot \"%s\" with lines linetype 1 \n",data_file);
}
pclose(gp);
return 0;
}

補足日時:2014/09/11 11:14
    • good
    • 0

え? あれ? (out とか data とかの配列の存在意義がまったくわからんけどそれはそれとして) sprintf が使えるんだ... ん~, 何に困っているのかが分からない....



とりあえず確認事項は次の 3つくらいかなぁ.
・データを出力するファイル名がどこで指定されているかわかりますか?
・「gnuplotに送りこむデータ名」はどこで指定しているかわかりますか?
・「グラフ名」ってなんですか? どこで決まるかわかりますか?

この回答への補足

・データを出力するファイル名がどこで指定されているかわかりますか?

data_file="out.data";
これでしょうか?

・「gnuplotに送りこむデータ名」はどこで指定しているかわかりますか?

fprintf(gp,"plot \"%s\"with lines linetype 1 \n", data_file);
これでしょうか?

・「グラフ名」ってなんですか? どこで決まるかわかりますか?

グラフ名はout.pngなどでしょうか?
fprintf(gp,"set output 'out.png'\n"); で決まるのでしょうか?

Cからpmuglotにout103.data を送りout103.pngを作画するポイントをまとめました。

data_file="out103.data";
data = fopen(data_file,"w");
(適当なx,yデータを作って,data→datafile→out103.data)
fprintf(data,"%f\t%f\n",x,y)

fprint(gp,"set output 'out103.png'\n");
fprintf(gp,"plot \"%s\ with lines linetype 1 \n",data_file);

out103.dataの自然数103はfor文でなんとかなりそうです。
out103.pngの自然数もfor文で処理したいのですが、やりかたがわかりません。

補足日時:2014/09/10 15:55
    • good
    • 0

ちょっと確認してみよう.



int型の変数 i に対して, 標準出力に
out(iの値).data
と表示する (つまり i=1 なら out1.data と表示するし, i=103 なら out103.data と表示する) プログラムは作れますか?

この回答への補足

i=103に対して、out103.dataと表示するプログラムを作成しました。
命令sprintfにより、"out"と、".data"の間に自然数をはさんでいます。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void){
FILE *fo;
char outputfile[32] = {0}; //as out***.data
char out[] = "out";
int i;
char data[] = ".data";

printf("i?\n");
scanf("%d", &i);

sprintf(outputfile,"%s%d%s",out,i,data);
printf("i =%d, outputfile = %s\n", i,outputfile);
return 0;
}

補足日時:2014/09/10 13:35
    • good
    • 0

確認だけど, 「データファイル」は作らなきゃならないの?

この回答への補足

はい、処理の都合により、処理後のデータファイルとそれに対応するグラフが必要です。

今、検討していることは時間VS電界強度データの解析です。

すでに、時刻vs受信電界強度の2列のデータが大量に存在しています。
時刻の刻みは1秒であり、受信電界強度はdBMで、1日分ごとに取得しています。これが数百日分あります。

当初、エクセルで数値処理やグラフ作成を試していましたが、時間がかかるうえに手作業で手間がかかるので、C言語とgnuplotにより、作業の自動化と高速化を目指しています。

すでにC言語により、1分間の平均値を求めることはできました。さらに、複数のデータを処理(平均値計算)することにも成功しています。たぶん、何百個のデータでも繰り返し処理できます。

残りの課題は、グラフ化のくりかえし処理です。

fprintf(gp,"set output 'out.png'\n");
fprintf(gp,"plot \"%s\"with lines linetype 1 \n", data_file);

data_fileに対応する部分(入力データ名?)を書き換え、'out.ong'に対応する部分(グラフ名)を書き換えれば、多数のデータに対応するグラフが描けるように思うのですが、それができるのかどうかわかりません。gnuplotでできないのであれば、shellscriptの使用も考えています。

補足日時:2014/09/09 08:50
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!