目次

概要

  • Gnuplotの仕様上の欠陥とバグをすり抜けて、目的の動作をさせる方法
  • 便利なコマンド

点を打つ

set label 1 point pt 7 ps 3 lc rgb "dark-violet" at 0,0,800

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

コマンド群のバッチ実行

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

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

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

EOFによる実行

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

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

  • プロットするファイルを変えたい場合は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で一度に複数のグラフを表示し、その全てに関してマウスからの操作ができるようにしたい。
  • set termで複数の表示しても、その全てでインタラクティブな操作ができるようにするには、仮想ターミナルを作るしかない。xtermをバックグラウンドで起動することで実現できる。

方法

  • 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

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!

plotの中にコマンドを突っ込む

  • plot "<command"とすると、plotするデータ群を選択したり、ファイルを連結したりできる。
plot "<awk '$7 > 2.2049*$5-210.4416 {print}' mani" u 5:8
plot "<paste file1 file2 | awk '$1 > 2.0 {print}'

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