• ベストアンサー

C&gnuplotでデータ処理・グラフ作成保存

私の希望する作業は下記の通りです。 (1)linux上のCにより、時間変動データを取り込み、加工する。 (2)Cからgnuplotを制御し、加工後のデータをグラフ化する。 (3)グラフのデータを保存する。 Cを実行することにより、データ加工、グラフ化・保存を一気に実行したいのです。 (1)のデータの加工についてはできています。

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

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

gnuplotは標準入力から命令を受け取ってそれを実行しますので、Cで書いたプログラムを、gnuplotの命令をテキスト形式で出力するように改造し、パイプでgnuplotに送れば(3)までできます。 やり方はgnuplot、パイプで検索すればたくさんでてきます。 例えば http://akita-nct.jp/yamamoto/lecture/2006/5E/gnuplot/html/node4.html これはpopenでパイプを作っていますが、shell上で|で繋いでも構いません。

関連するQ&A

  • C言語を用いて、GNUPLOTでリアルタイムにグラフ化方法について。

    C言語を使用して、GNUPLOTを呼び出し、時間とともに更新されていくデータをリアルタイムでグラフ化しようと思っていますが、なかなかうまくいきません。 私が考えていた簡単なプログラムのシーケンスとして、(OSはLinuxです。) ~データの作成~  fopen;データファイルの作成  fprintf;/データの作成  fclose;/データの保存 ~グラフ化~  popen;/GNUPLOTの呼出  fprintf(---,”plot \”[作成したデータファイル]\”\n”);/グラフ化 ~データの更新~  fopen;  fprintf;  fclose;/データの上書き ~グラフの更新~  fprintf(---,”reread\n”);/データの再読み込み  fprintf(---,”replot\n”);/グラフの更新 ~データの更新~ ~グラフの更新~ ・・・/ループ  pclose;/GNUPLOTの終了 と、データを更新したら、グラフ化をしていく予定でした(汗)。 テスト的に10回だけデータの更新をするプログラムを動作させると、 データの更新を先に全部行ってしまい、グラフ化されるのが、最後の更新データのみでした。 どのようにしたら、リアルタイムにデータをプロットできるでしょうか?? よろしくお願い致します。

  • Octaveのデータを保存し、gnuplotで表示

    現在、Octaveの計算結果の数値を保存しgnuplotでグラフ表示させたいと考えています。 ですが、for文を利用した際に最後のループの数値しか保存されません。 すべての数値を保存したいのですがどのようにすればよいかご意見をいただけないでしょうか。(mファイルで実行しています) また、保存したデータをグラフ化する際のgnuplotのコマンドを教えて頂けないでしょうか。 よろしくお願いします。 【参考プログラム】 for a=-2:1:2 for b=-2:1:2 printf("x(1)=%f x(2)=%f \n",a,b); printf("\n"); endfor endfor save nn.dat a b

  • データファイルをプロットする(gnuplot)

    gnuplotを使ってデータファイルをプロットしたいのですがうまくいきません。 gnuplot初心者です。よろしくお願いします。 plot "gtest.dat" とコマンドを打つと、 warning: Skipping unreadable file "gtest.dat" No data in plot となってグラフが表示されません。 ちなみにgtest.datの中身は、 1 20 2 60 3 80 4 60 5 100 です。 原因として自分で怪しいと思っているのは、 1.gtest.datの置いてある場所   Cドライブの下の適当なフォルダにおいて実行したのですが、これがまずいのでしょうか。   置く場所は決まっているのでしょうか。 2.DATファイルの作り方   gnuplotの使い方の説明のサイトではいつもファイルのプロットの際、DATファイルが使われていたので   自分もそれに合わせようとそたのですが作り方に自信がありません。   メモ帳で作成し保存の際、拡張子を.datに変更しました。   これでいいのっでしょうか。 長くなりましたが、よろしくお願いします。  

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

  • BME280データのグラフ化

    https://karaage.hatenadiary.jp/entry/2016/05/11/073000 上記のサイトの記事を見て作っています。 記事はBME280からのデーターをi2cでraspiに送りそのデーターをcsvデーターに 変換しそれをgnuplotでグラフ化すると言う記事です。 ------------------------------------------------------------------- 記事のTOPの表題は (pythonのサンプルプログラムで温度・湿度を取得) (温度・湿度をグラフ化)の内容部分  このままだとわかりづらいので、データをまとめてグラフ化してみます。PC上でエクセル的なもので処理するのも面倒くさいのでRaspberry Piでグラフを生成・・・ ------------------------------------------------------------------------ (温度・湿度をグラフ化)のところから分からないので作者にお尋ねしたのですが さっぱり分かりません。 どうしたらCSVのデーターからGNUPLOTを作成したいのですがどの様に勧めたら良いのか教えて頂けないでしょうか。

  • gnuplotデータを編集してプロット

    gnuplotでデータを編集してプロットしようと思い、 set datafile separator "," plot 'test.csv' using 1:($4*2) with lines と打ちました。 これを、gnuplotに直接打つとうまくいくのですが、これをtest.pltというファイルに保存して、 call 'test.plt' と、実行すると、 gnuplot> call 'test.plt' gnuplot> plot 'PIDtorque.csv' using 1:(*2) with lines                     ^ "test.plt", line 2: invalid expression と、表示されます。 これは何故なのでしょうか? 宜しくお願いします。

  • C言語 3次元グラフ

    今、スペクトラムアナライザという計測機器をC言語を用いてデータを取得し、CSVファイルに書き込みました。その後、CSVファイルを開き、エクセルで3Dグラフ(等高線を用いました)にしようとしたのですが系列が255個までという制限がありました。私の取得したデータは461ポイントあるのでグラフを2分割しなければなりません。 CSVファイルの中身の一例としては 周波数,8000,9000,10000・・・ 11:00,-60E01,-61E01,-61E01・・・ 11:01,-62E01,-61E01,-60E01・・・ ・ ・ ・ ちょっと見づらいですが、1行目が周波数で1列目が取得した時間で2行目以降は周波数における電力です。プログラムとしてはデータを取得するコマンドを1秒ごとに送り、1行ごとにCSVファイルに書き込みをしています。 前置きが長くなりましたが、これを3Dグラフにするには何を学習しなければならないでしょうか?友達はWindowsプログラミングで書けばいいよと教えてくれたので、猫でも分かるWindowsプログラミングを買ってきたのですが中々難しそうで最初から挫折しそうです。後、いろいろ調べているとgnuplotという単語が良く出てくるのですが、 1)gnuplotで3次元グラフは作成できますか? 2)仮にgnuplotで3次元グラフが描けるなら、Windowsプログラミングとgnuplotではどちらを学習したほうがいいでしょうか? 参考書やお勧めのURLがあったらお願いします。

  • EXCELのグラフ作成時に元データが#DIV/0のデータを0ではなく存在しないものと出来ませんか?

    EXCEL2000で例えば折れ線グラフを作成します。 データ    1月   2月   3月 a   6    3    12 b   7 #DIV/0!    14 c   8    8   (IF関数で#DIV/0エラーを非表示) このようなデータを使ってグラフを作成すると、#DIV/0!やIF関数で#DIV/0エラーを非表示にしたセルのグラフがゼロで表されます。 これをゼロと認識させずに、グラフ上で存在しないようにすることは不可能でしょうか? 現状は対象セルのデータを消去してからグラフ作成、印刷、データをもとの状態に戻して保存という作業をしています。 表現がわかりにくかったらごめんなさい。   

  • データ抽出→グラフ作成

    次の様な書類を作成しています。 1  A   B  C   D E  F   G  H  I J   K  L  M 2 1-1 5000 4500 - -  2-1 5000 4800 - - 3-1 5000 5000 3 1-2 5000 4900 - -  2-2 5000 4700 - - 3-2 5000 5100 4  -  -  -  - -  2-3 5000 5000 - -  -  -  - 5  -  -  -  - -  -  -  -  - -  -  -  - (-は空白セルです) この表から値の入っている数値を抜き出して行5に折れ線グラフを作成したいと思っています。(ちなみにデータの数はその都度変わります) 現在は、前回作成したファイルを修正する形で使用しており、A列~M列にデータを入力した後、グラフの元データとして値の入っているデータを手作業でコピーして列R2・S2・T2から下に一つにまとめ、あとはグラフの書式で元データの数を調整しています。 そしてこのデータからグラフまでの表が下に5つほど連続であります。 この一連の流れを自動でできないものでしょうか? このファイルを使用する人は数人おり、そこそこエクセルを使える人から初心者の方までさまざまです。 出来れば、値を入力する度に自動的に変わっていくのが一番の希望ですが、無理な場合、ボタン一つで一連の流れが実行できるようにできないかと思っています。 自分でもいろいろ調べて考えてみたのですが、 グラフのデータ範囲はOFFSET関数を使用して自動的に変化させることができたのですが、 データの移行が、R列に =IF(ROW()-1>COUNTIF($A$2:$A$5,"<>"),"",INDEX(($A$1:$A$5),SMALL(IF($A$2:$A$5="","",ROW($A$2:$A$5)),ROW()-1))) S列に =IF(R1="","",VLOOKUP(R1,A2:M5,2,0)) T列に =IF(R1="","",VLOOKUP(R1,A2:M5,3,0)) これでA列~C列までは出来たのですが、続けてF列~H列、K列~M列のデータの抽出する方法がわからずとまってしまってます。 宜しくお願いします。

  • 積み上げ棒グラフと折れ線グラフを同じグラフ内で作成したいのですが・・

    一つのグラフでこんな感じのを作成したいです。 データは下記です。 1Q(クオーター) 計37個 Aさん 3個 2個 4個  Bさん 6個 1個 7個 Cさん 1個 4個 9個 これが2Q、3Q、4Qまであって、AさんからCさんのデータはQ毎に積み上げ縦棒、1Q~4QまではQ毎に合計値であらわし、それを折れ線グラフで作成したいのです。 どなたか教えて頂けると助かります。

専門家に質問してみよう