目次

概要

  • Gnuplotの仕様上の欠陥とバグをすり抜けて、目的の動作をさせる方法について。

バッチモードとインタラクティブモード

  • ttyデバイスが標準入力に割り当てられているときはインタラクティブモード、そうでない場合はインタラクティブモードで起動する。
  • シェルを起動してgnuplotと打つとキーボードがあるのでインタラクティブモード、パイプやなどで流し込むとバッチモードで起動する。
  • 外部から起動する場合は↓のようにする(そうしないと一瞬で終了する)。pause -1はバグバグしいので使ってはならない
gnuplot -persist < file
gnuplot -persist << EOF
  p 'a.txt'
EOF

共通ファイル

  • a.txt
    1
    2
    3
    4
    5
  • b.txt
    6
    7
    8
    9
    10

コマンド群のバッチ実行

ファイルによる実行(リダイレクト)

  • test.gpl
    plot 'a.txt' u 1
  • 起動
    gnuplot -persist < test.gpl #リダイレクトをしないファイルによる実行は不可!

EOFによる実行

gnuplot -persist << EOF
plot 'a.txt' u 1
EOF 

説明

  • gnuplot test.gplとしても、gnuplot test.gplとしても、test.gplのEOFを検知した時点でgnuplotは終了する。
    • 我々が観測できるのは「gnuplotを起動して描画が終わった瞬間に終了して全くグラフが見えない」という状態。これを防ぐために-persistが必要。
  • pause -1は、「インタラクティブモードの時はそこで処理を止め、バッチモードの時はスルーする」という謎コマンド。
    • めんどいので使ってはならない。

描画すべきファイル名をシェルスクリプトの引数で指定する

  • プロットするファイルを変えたい場合はsedなり何なりで、ファイルを作ってからでないとプロットできない。

シェルスクリプトに全部突っ込む

  • test.sh
    gnuplot -persist EOF
    plot '$1' u 1
    EOF
  • 起動方法
    ./test.sh a.txt
    ./test.sh b.txt

sedで置換

  • test.gpl.templete
    plot 'FILENAMETOCHANGE' u 1
  • test.sh
    sed 's/FILENAMETOCHANGE/$1/g' test.gpl
    gnuplot -persist test.gpl
  • 起動方法
    ./test.sh a.txt
    ./test.sh b.txt

複数グラフ表示

  • gnuplotで一度に複数のグラフを表示し、その全てに関してマウスからの操作ができるようにしたい。-

方法

  • plot_a.gpl
    plot 'a.txt' u 1
  • plot_b.gpl
    plot 'b.txt' u 1
  • plot_multi.sh
    xterm -e gnuplot -persist plot_a.gpl &amp;
    xterm -e gnuplot -persist plot_b.gpl &amp;
  • 起動方法
    ./plot_multi.sh

説明

  • set termで複数の表示しても、その全てでインタラクティブな操作ができるようにするには、仮想ターミナルを作るしかない。xtermをバックグラウンドで起動することで実現できる。

Cからgnuplot操作

  • パイプでつなげるだけ。
    #include <stdio.h>
    
    int main(void)
    {  
      FILE *gp = popen('gnuplot -persist', 'w');
      fprintf(gp, 'set parametric\n');
      fprintf(gp, 'set size square\n');
      fprintf(gp, 'set xrange [-1:1]\n');
      fprintf(gp, 'set yrange [-1:1]\n');
      fprintf(gp, 'plot [0:2*pi] cos(t),sin(t)\n');
      pclose(gp);
    
      return 0;
    }  

最小二乗法

  • 例:ノイズありのy=x*xのデータに、y=0.5*x*x+0*x+0を初期値として最適化
seq 10 | awk '{printf("%d %f\n", $0, $0 * $0 + rand());}' > data
cat data

gnuplot
f(x)=a*x*x+b*x+c
a=0.5;b=0;c=0;
plot f(x), 'data' using 1:2 # not fitted yet
fit f(x) 'data' u 1:2 via a,b,c
plot f(x), 'data' using 1:2 # fitted!

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS