• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:gnuplotをC言語で操作する方法)

gnuplotをC言語で操作する方法

このQ&Aのポイント
  • C言語を使ってgnuplotを操作し、データファイルから自動的にグラフを作成するプログラムを作る方法について紹介します。
  • Windows7とVisualStudio2010を使用していますが、一部のコマンドが正しく表示されない問題に遭遇しました。
  • 特に、軸の目盛ラベルの表示フォーマット設定のコマンドである「set format x」の部分が正しく動作しなかったため、解決策を模索しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

fprintf の引数は(FILE*, フォーマット文字列,....) だと言うことをお忘れではないでしょうか? %.1fはfprintfで解釈されて、dounle型を変換した文字列が出力されます。 そのdouble型の引数が無いんので、なにかその領域にあるものを無理矢理変換したか、領域違反でエラーになったか、です。 そのまま%を送りたいなら、次のようなものが常套手段でしょう。 fprintf(gp, "set format x '%%.1f' \n"); // %を二つ並べて、フォーマット変換を無効にする fprintf(gp,"%s" "set format x '%.1f' \n"); // フォーマットに%sを指定して、文字列を与える

KabosuOrange
質問者

お礼

ありがとうございました!! 正しく反映されました。 基本がまだ全然できていなかったです・・・

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語における漢字の取り扱いについて??

    C言語とgnuplotを利用して下記のプログラムを書きました。 #include<iostream> #include<cstdio> #include<stdio.h> using namespace std; #define GNUPLOT_PATH "C:/gnuplot/gnuplot/binary/gnuplot.exe" int main() { FILE *gp; char s[100]; scanf("%s", s); gp = _popen(GNUPLOT_PATH, "w"); if (gp == NULL) { fprintf(stderr, "Oops, I can't find %s.", GNUPLOT_PATH); exit(EXIT_FAILURE); } // gnuplotにコマンドを送る fprintf(gp, "set terminal png\n"); fprintf(gp, "set output 'plot_sample.png'\n"); //fprintf(gp, "set "xl 距離"\n"); fprintf(gp, "set title '%s'", s); fprintf(gp, "set xrange [-pi:pi]\n"); fprintf(gp, "plot sin(x), (x+1)*x*(x-1)\n"); fflush(gp); // バッファに格納されているデータを吐き出す(必須) //getchar(); // 入力待ち _pclose(gp); exit(EXIT_SUCCESS); } ここでscanf(%s,s);のところでsに、あア亜と入力しました。 最終的にpngの画像としてあア亜と出力させようとしているのですが、文字化けして文字がうまくひょうじされていません。 なぜ、うまくいかないのかわかっていません。 pngにおける文字の取り扱いの問題なのかC言語における文字の取り扱いなのかと考えて解決策を考えているのですが、うまくいきません。 もしわかる方がいましたら教えていただけないでしょうか? よろしくお願いいたします。

  • gnuplotでreplotできない??

    下記のプログラムを書きました。 下記のプログラムでは1枚のグラフの複数のグラフをどんどん重ね、さらに1つのemfファイルとして出力し保存しようとしています。 しかし、問題が発生しました。 プログラム中のfprintf(gp, "replot (x+1)*x*(x-1)\n");を消すとプログラムは動くのですがreplotがあるとうまく画像ファイルが保存されません。 emfファイルはできている(ファイル容量は0ではない。)のですが、emfファイルが壊れており見ることができません。 その理由がわかる方がいましたら、教えていただけないでしょうか? よろしくお願いします。 以下、書いたプログラムです。 #include <stdio.h> #include <windows.h> #include <tchar.h> #include <string> #include<conio.h> using namespace std; #define GNUPLOT_PATH "C:/gnuplot/gnuplot/binary/gnuplot.exe" //char *a[10]; char a[10][50]; long n; long l; int main() { FILE *gp; gp = _popen(GNUPLOT_PATH, "w"); if (gp == NULL) { fprintf(stderr, "Oops, I can't find %s.", GNUPLOT_PATH); exit(EXIT_FAILURE); } // gnuplotにコマンドを送る fprintf(gp, "set terminal emf color 'Ryumin-Light-EUC-H' 16\n"); fprintf(gp, "set output '%s.emf'\n", a[n]); fprintf(gp, "set title '日本語-入力テスト'\n"); //x軸の範囲の設定 //fprintf(gp, "set xrange [-60:60]\n"); //fprintf(gp, "set yrange [0:3]\n"); fprintf(gp, "set grid\n"); fprintf(gp, "set datafile separator ','\n"); fprintf(gp, "set datafile separator ','\n"); fprintf(gp, "set key bottom outside\n"); fprintf(gp, "plot sin(x)\n");     fprintf(gp, "replot (x+1)*x*(x-1)\n"); fflush(gp); // バッファに格納されているデータを吐き出す(必須) //getchar(); // 入力待ち _pclose(gp); exit(EXIT_SUCCESS); return 0; }

  • gnuplot で2本のグラフを一つにまとめる

    表示したいデータ X   Y1    Y2 2.000  3.0   -86.10 2.167  15.0   -90.64 2.333  21.0   -87.25 2.500   6.0    -84.04 表示するプログラム #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> char output_file[128]; int main(void){ sprintf(output_file,"./output.txt"); FILE *gp = popen("gnuplot -persist","w"); fprintf(gp, "set terminal png\n"); fprintf(gp, "set xrange [1:3]\n"); fprintf(gp, "set xtics 1,1,3\n"); fprintf(gp, "set mxtics 6\n"); fprintf(gp, "set xlabel 'Hour'\n"); fprintf(gp, "set yrange [0:50]\n"); fprintf(gp, "set ytics 0,5,50\n"); fprintf(gp, "set ylabel 'mm/h'\n"); fprintf(gp, "set y2range [-90:-75]\n"); fprintf(gp, "set y2tics -90,5,-75\n"); fprintf(gp, "set ytics nomirror\n"); fprintf(gp, "set my2tics 5\n"); fprintf(gp, "set y2label 'dbm'\n"); fprintf(gp, "set output './output.png'\n"); fprintf(gp, "set title 'Rain and Attenuation'\n"); fprintf(gp, "plot './output.txt' using 1:2 with lines linetype 1 ,'./output.txt' using 1:3"); } 左横軸は0から50までとなりました。 右横軸はー90からー80までとなりました。 XvsY1の曲線は左横軸に対応して正しく表示されました。 ただし、XvsY2の曲線は表示されませんでした。 解決法を教えてください。

  • c言語とgnu

    gnuをc言語に通すプログラムを作っているのですが 教授に聞きにいっても、教えてくれずに本当に困っています 時計の針を動かすプログラムを作りたいのですが 時計の針が出てきません for文の使い方と 最後のほうのpauseの使い方が間違っていると思うのですが どこがどう間違ってるのか教えてくださいお願いします プログラム #include "stdafx.h" //この文は通常、不要。単純アプリやHello worldを選ぶと必要。 #include <stdio.h> // はずしても通る #include <stdlib.h> #include <math.h> //数学関数の呼び出しに使用する。 #define GNUPLOT_PATH "C:/FUJITA/gnuplot/bin/pgnuplot" int main(int argc, char* argv[]) { double theta,a,b,k,pi; pi=3.14; FILE *gp; gp = _popen(GNUPLOT_PATH, "w"); if(gp == NULL){ fprintf(stderr, "Oops, I can't find %s.", GNUPLOT_PATH); exit(EXIT_FAILURE); } fprintf(gp, "reset\n"); fprintf(gp, "set title Clock \n"); fprintf(gp, "set size square \n"); fprintf(gp, "set key off\n"); fprintf(gp, "unset border \n"); fprintf(gp, "unset xtics \n"); fprintf(gp, "unset ytics \n"); fprintf(gp, "set grid \n"); fprintf(gp, "set parametric \n"); fprintf(gp, "set xrange [-1:1] \n"); fprintf(gp, "set yrange [-1:1.2] \n"); fprintf(gp, "set grid \n"); for (k=0; k<10; k++){ theta=k; fprintf(gp,"set a=0.5*pi-(theta*pi)/180.0"); fprintf(gp,"set b=0.5*pi-(theta*pi)/(180.0*12.0)"); fprintf(gp,"set arrow 1 from 0.0,0.0 to 0.4*cos(b),0.4*sin(b) front size 0.1,30 lt 5 lw 5"); fprintf(gp,"set arrow 2 from 0.0,0.0 to 0.8*cos(a),0.8*sin(a) front size 0.1,15 lt 5 lw 3"); } fprintf(gp," set arrow 1 from 0.0,0.0 to 0.4*cos(b),0.4*sin(b) front size 0.1,30 lt 5 lw 5\n""0.4*cos(b),0.4*sin(b)"); fprintf(gp," set arrow 2 from 0.0,0.0 to 0.8*cos(b),0.8*sin(b) front size 0.1,15 lt 5 lw 3\n","0.8*cos(a),0.8*sin(a)"); fprintf(gp,"plot sin(t),cos(t)\n"); fprintf(gp,"pause 100 \n"); return (0); }

  • gnuplotの出力グラフ名を外部で書き換えたい

    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; }

  • gnuをc言語に通して時計を作る という課題をやっています ビルドした結果、a、b、theta、のローカル変数は一度も使われておりませんと出てきてしまい、時計の針が出てきません fprintf(gp, "set a=%lf, a"); fprintf(gp, "set b=%lf, b"); fprintf(gp, "set theta=%lf, theta"); と設定したつもりですがどこがどう間違えてるかわかりません お願いします。下にソースファイルのプログラムを載せときました #include "stdafx.h" //この文は通常、不要。単純アプリやHello worldを選ぶと必要。 #include <stdio.h> // はずしても通る #include <stdlib.h> #include <math.h> //数学関数の呼び出しに使用する。 #define GNUPLOT_PATH "C:/FUJITA/gnuplot/bin/pgnuplot" int main(int argc, char* argv[]) { double a,b,theta,k; FILE *gp; gp = _popen(GNUPLOT_PATH, "w"); if(gp == NULL){ fprintf(stderr, "Oops, I can't find %s.", GNUPLOT_PATH); exit(EXIT_FAILURE); } fprintf(gp, "reset\n"); fprintf(gp, "set title Clock \n"); fprintf(gp, "set size square \n"); fprintf(gp, "set key off\n"); fprintf(gp, "unset border \n"); fprintf(gp, "unset xtics \n"); fprintf(gp, "unset ytics \n"); fprintf(gp, "set grid \n"); fprintf(gp, "set parametric \n"); fprintf(gp, "set xrange [-1:1] \n"); fprintf(gp, "set yrange [-1:1.2] \n"); fprintf(gp, "set pi=%lf, pi \n"); fprintf(gp, "set a=%lf, a"); fprintf(gp, "set b=%lf, b"); fprintf(gp, "set theta=%lf, theta"); fprintf(gp, "set grid \n"); for (k=0; k<10; k++){ fprintf(gp,"theta=k \n"); fprintf(gp,"set a=0.5*pi-(theta*pi)/180.0 \n"); fprintf(gp,"set b=0.5*pi-(theta*pi)/(180.0*12.0)"); fprintf(gp,"set arrow 1 from 0.0,0.0 to 0.4*cos(b),0.4*sin(b) front size 0.1,30 lt 5 lw 5 \n"); fprintf(gp,"set arrow 2 from 0.0,0.0 to 0.8*cos(a),0.8*sin(a) front size 0.1,15 lt 5 lw 3 \n"); } fprintf(gp," set arrow 1 from 0.0,0.0 to 0.4*cos(b),0.4*sin(b) front size 0.1,30 lt 5 lw 5\n""0.4*cos(b),0.4*sin(b) \n"); fprintf(gp," set arrow 2 from 0.0,0.0 to 0.8*cos(b),0.8*sin(b) front size 0.1,15 lt 5 lw 3\n","0.8*cos(a),0.8*sin(a) \n"); fprintf(gp,"plot sin(t),cos(t)\n"); fprintf(gp,"pause 100 \n"); return (0); }

  • 入力を待たずにstdinの監視をしたい(C言語)

    こんにちは.タイトルのままなのですが,c言語でstdinに何かが入力されるまで待つことなく,stdinの監視がしたいです.例えば, whileループを回してる最中に,qがstdinに入力されたらbreakするけど,あとは普通に回る,みたいな感じにしたいです.fgetc(stdin)とすると,毎回入力を待つことになるので,待たないで回る方法が知りたいです. 具体的には,以下はgnuplotにsinカーブを表示するプログラムですが,コメントアウトしてある /* if((buf = fgetc(stdin)) == 'q'){ break; } */ の部分のようにすると毎回とまってしまいます.これを,毎回入力を待たずに,qを打ったら止まるようにするにはどうするのが普通なのでしょうか. 返信おまちしております. #include <stdio.h> #include <math.h> #include <unistd.h> FILE *gp; #define omega (M_PI/2) #define A 1 #define N 10 int i; int j; double x, t; int main(void) { gp = popen(gnuplot, "w"); fprintf(gp, "set xrange [0:11]\n"); fprintf(gp, "set yrange [-3.5:3.5]\n"); fprintf(gp, "set xlabel \"x\"\n"); fprintf(gp, "set ylabel \"y\"\n"); char buf; for (j = 0; j < N*160; ++j) { usleep(5000); /* if((buf = fgetc(stdin)) == 'q'){ break; } */ fprintf(gp, "plot '-' with lines linetype 1\n"); for (i = 0; i < j+1; ++i) { t = 0.1*i; x = A*sin(omega*t); fprintf(gp, "%f\t%f\n", t/10, x); } fprintf(gp, "e\n"); } fprintf(gp, "exit\n"); fflush(gp); pclose(gp); return 0; }

  • C言語からgnuplot呼び出し

    C言語からgnuplotを呼び出したいのですが、一瞬表示されてすぐ消えてしまいます。 プログラムは以下のように書きました。 --------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc, char **argv) { FILE *gid; int i; double x; gid=popen("gnuplot -persist","w"); for (i=0; i<100 ;i++){ x = 0.03*i; fprintf(gid,"plot sin(x-%f*pi)\n",x); } pclose(gid); } --------------------------------------------------------------- この後、 gcc test.c -lm ./a.out でコンパイル、実行しました。 かなり初心者なので初歩的な質問かもしれませんがよろしくお願いします。

  • gnuplotについて質問です。

    現在、linuxでC言語からパイプを使ってgnuplotに接続し、計算した結果をすぐに表示しようとしています。 下のようなプログラムでうまくいくと思ったのですが、グラフが表示されるのにすごい時間がかかってしまいます。 解決策をご存知でしたらご教示お願いいたします。 #include<stdio.h> #include<stdlib.h> #include<math.h> void main(){ FILE *plotin; double x , y; int i = 0; struct sched_param param; struct timespec tt; //gnuplotにパイプで接続 plotin = popen("gnuplot","w"); //制御LOOP開始 for(i = 0 ; i < 1000 ; i ++) { if( i == 10000) { exit(0); } //gnuplotで表示するグラフの計算 x = i * 0.01; y = x*x; //gnuplotに表示する fprintf(plotin,"plot '-' title \"oscillation\" \n"); fprintf(plotin,"%f %f\n", x,y); fprintf(plotin,"e\n"); i++; } //gnuplot閉じる pclose(plotin); }

  • C言語によるgnuplotの呼び出し

    シミュレーションによって得られた計算結果を自動的にgnuplotで 表示させるプログラミングを作成しました。シミュレーション自体は fortranで行っていてfort.61というファイルが出力されます。 c言語でこのファイルを読みとって、それに少し細工をしfort.62 というファイルに新たに書き込んで、gnuplotで表示させたいのですが、 gnuplotの画面で no valid dataというエラーが表示されてしまいます。 ところが、cのプログラムを終了させてからgnuplotでこのfort.62を 通常の方法でplotすると、きちんとグラフが表示されます。 何が原因がわかるかたいらっしゃいましたら、教えて下さい。 ちなみにコンパイルはcygwin上でgccを使用しています。以下にソース を添付します。gnuplotで読み込んでいるファイルplot.pltは 「plot "fort.62"」と記述してあるtextファイルです。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) {     FILE *fp,*fp2;     int i,N;     double x,y;     double volt[100],curr[100];     double norm,para;     para = 0.2442E-03;     N=14;     fp=fopen("fort.61","r");     for(i=0;i<N;i++){       fscanf(fp,"%lf %lf",&x,&y);       volt[i] = x;       curr[i] = y;       if(volt[i] == -1.0){       norm = para/curr[i];       }     }     for(i=0;i<N;i++){       curr[i] = norm*curr[i];     }   close(fp);   fp2 = fopen("fort.62","w");     for(i=0;i<N;i++){       fprintf(fp2,"%lf %lf\n",volt[i],curr[i]);     }     close(fp2);     system("wgnuplot -persist plot.plt"); }

このQ&Aのポイント
  • 更年期障害で悩む57歳事務員の方がホットフラッシュによる不快な症状で仕事に集中できなくなっています。
  • サウナのようにのぼせて汗が止まらない状況でデータ入力が難しくなっています。
  • 同じ悩みを持つ方々はどのように対策しているのか、具体的な方法を教えてください。
回答を見る

専門家に質問してみよう