![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
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;
}
No.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;
}
No.3
- 回答日時:
え? あれ? (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文で処理したいのですが、やりかたがわかりません。
No.2
- 回答日時:
ちょっと確認してみよう.
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;
}
No.1
- 回答日時:
確認だけど, 「データファイル」は作らなきゃならないの?
この回答への補足
はい、処理の都合により、処理後のデータファイルとそれに対応するグラフが必要です。
今、検討していることは時間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の使用も考えています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- Windows 10 EFS(内容を暗号化してデータをセキュリティで保護する)はHomeエディションでは使えませんか??? 1 2023/05/20 18:16
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
【Excel VBA】10進数を2進数に...
-
とほほさんのファイルのアップ...
-
matlabのソースコードをpython...
-
10Mバイトて文字数に すると何...
-
ListView重複データ削除
-
LWP::Simple;でWebページを取得...
-
“半角カタカナ”は、ずいぶん昔...
-
ビットスワップとバイトスワッ...
-
VBAでShift-JISのURLエンコード
-
CGIの変数に配列を代入する方法
-
VB2010でラベルに文字を結合したい
-
utf-8でメールを送信すると件名...
-
C言語でwin32apiを使ってnotepa...
-
文字化けとパスワード変更
-
チェックボックスのvalue値の取...
-
文字コードの利点・欠点について
-
PICマイコンで変数値の保持
-
なんで外国人の書く顔文字は横...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
linuxのシェルでファイル名に先...
-
int型(2バイト)データの分割
-
【Excel VBA】10進数を2進数に...
-
C#でのswitch文
-
データの値の近いものをグルー...
-
C言語 ファイル内のデータと入...
-
10個の実数に対する降順ソート...
-
C言語の構造体にてバブルソート...
-
'dataType' 引数を Null にする...
-
matlabのソースコードをpython...
-
C言語の勉強しています。すみま...
-
c言語での wavファイルの編集(...
-
テキストファイルの結合について
-
C言語についてです! 同じ年の...
-
C言語の勉強しています。すみま...
-
sort関数でひらがなとカタカナ...
おすすめ情報