目次 †
概要 †
- 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は、「インタラクティブモードの時はそこで処理を止め、バッチモードの時はスルーする」という謎コマンド。
ファイルによる実行(リダイレクト) †
EOFによる実行 †
gnuplot -persist << EOF
plot 'a.txt' u 1
EOF
描画すべきファイル名をシェルスクリプトの引数で指定する †
- プロットするファイルを変えたい場合はsedなり何なりで、ファイルを作ってからでないとプロットできない。
シェルスクリプトに全部突っ込む †
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をバックグラウンドで起動することで実現できる。
方法 †
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!
指数関数 †
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 †