目次 †
概要 †
- 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
コマンド群のバッチ実行 †
ファイルによる実行(リダイレクト) †
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なり何なりで、ファイルを作ってからでないとプロットできない。
シェルスクリプトに全部突っ込む †
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!