目次

概要

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

点を打つ

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

ヒートマップ

set pm3d 
set pm3d map
set ticslevel 0
set cbrange[-1:1]
set palette defined (-1 "blue", 0 "white", 1 "red")
splot "data" with pm3d
  • dataは以下のような形式になっている必要がある。
1 1 0.33
1 2 0.457
1 3 0.45

2 1 0.33
2 2 0.457
2 3 0.45

3 1 0.33
3 2 0.457
3 3 0.45

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!

指数関数

  • モータがエンコーダ速度0から飽和まで加速した場合
f(x)=a*(1-exp(-b*x)) # ''x=0での傾きはab、x=infでの速度はa、bは系に固有''
a=20.0;b=2.0;
fit f(x) './0.6-5step-vel' u ($0/40):1 via a,b # /40は、25ms周期のサンプリングだから
plot f(x), './0.6-5step-vel' using ($0/40):1

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

  • plot "<command"とすると、plotするデータ群を選択したり、ファイルを連結したりできる。
    • plot '<command'では動かない。
    • "<"内部に“ダブルクオーテーションは使えない??エスケープする方法がわからない。
plot "<awk '$7 > 2.2049*$5-210.4416 {print}' mani" u 5:8
plot "<paste file1 file2 | awk '$1 > 2.0 {print}'

multiplot

set multiplot layout 2,1  #multiplotの開始、縦2横1自動配置
set xrange [1950:2150]
set yrange [500:1500]
p "a" u 2 w l
set yrange [-1.1:1.1]
p "a" u 3 w l

multiplotでreplot

  • replotコマンドは使えない.(参考

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