*目次 [#d7115537] #contents *概要 [#sb3a0ee6] -Gnuplotの仕様上の欠陥とバグをすり抜けて、目的の動作をさせる方法 *出力 [#o65b444f] **eps(論文用) [#c11decdd] set xrange [0:400] p "bla" u 1:4 w l rep "eigen" u 1:4 w l set terminal postscript eps enhanced color set output "out.eps" replot **png [#g3ea94f0] set xrange [0:400] p "bla" u 1:4 w l rep "eigen" u 1:4 w l set terminal png set output 'sinc.png' *点を打つ [#if1cb850] set label 1 point pt 7 ps 3 lc rgb "dark-violet" at 0,0,800 *ヒートマップ [#haba1451] -[[参考>http://www.natural-science.or.jp/article/20091028205740.php]] 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自動化 [#gba14913] **バッチモードとインタラクティブモード [#r0711396] -ttyデバイスが標準入力に割り当てられているときはインタラクティブモード、そうでない場合はインタラクティブモードで起動する。 -シェルを起動してgnuplotと打つとキーボードがあるのでインタラクティブモード、パイプやなどで流し込むとバッチモードで起動する。 -外部から起動する場合は↓のようにする(そうしないと一瞬で終了する)。''pause -1はバグバグしいので使ってはならない'' gnuplot -persist < file gnuplot -persist << EOF p 'a.txt' EOF **共通ファイル [#o828a13f] -a.txt 1 2 3 4 5 -b.txt 6 7 8 9 10 **コマンド群のバッチ実行 [#h410e858] -gnuplot test.gplとしても、gnuplot test.gplとしても、test.gplのEOFを検知した時点でgnuplotは終了する。 --我々が観測できるのは「gnuplotを起動して描画が終わった瞬間に終了して全くグラフが見えない」という状態。これを防ぐために-persistが必要。 -pause -1は、「インタラクティブモードの時はそこで処理を止め、バッチモードの時はスルーする」という謎コマンド。 --めんどいので使ってはならない。 ***ファイルによる実行(リダイレクト) [#h00e0d1d] -test.gpl plot 'a.txt' u 1 -起動 gnuplot -persist < test.gpl #リダイレクトをしないファイルによる実行は不可! ***EOFによる実行 [#mf0cb219] gnuplot -persist << EOF plot 'a.txt' u 1 EOF **描画すべきファイル名をシェルスクリプトの引数で指定する [#ca4175f0] -プロットするファイルを変えたい場合はsedなり何なりで、ファイルを作ってからでないとプロットできない。 ***シェルスクリプトに全部突っ込む [#k65578d2] -test.sh gnuplot -persist EOF plot '$1' u 1 EOF -起動方法 ./test.sh a.txt ./test.sh b.txt ***sedで置換 [#qa6af075] -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 **複数グラフ表示 [#ic0f0c85] -gnuplotで一度に複数のグラフを表示し、その全てに関してマウスからの操作ができるようにしたい。 -set termで複数の表示しても、その全てでインタラクティブな操作ができるようにするには、仮想ターミナルを作るしかない。xtermをバックグラウンドで起動することで実現できる。 ***方法 [#g9878d36] -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 & xterm -e gnuplot -persist plot_b.gpl & -起動方法 ./plot_multi.sh *Cからgnuplot操作 [#b0547163] -パイプでつなげるだけ。 #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; } *最小二乗法 [#f207fcea] **二次方程式 [#geedb9f8] -ノイズありの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! **指数関数 [#ra97166c] -モータがエンコーダ速度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 **多変数関数 [#mdc83029] -ファイルaの1列目2列目がx, yで、3列目がg(x, y)であるようなデータが与えられた時、以下のようにすれば多変数関数の最小二乗法ができる g(x,y)=a*x+b*y+c+d*x*y+e*x*x+f*y*y fit g(x,y) 'a' using 1:2:3:(1) via a,b,c,d,e,f sp g(x, y) rep 'a' *plotの中にコマンドを突っ込む [#o7004246] -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 [#j57bfd84] 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 [#a2548f52] -replotコマンドは使えない.([[参考>http://coffee.guhaw.com/Entry/242/]]) |