memo

Table of Contents

Gnuplot

球を描く

unset key; set border 0
unset xtics; unset ytics; unset ztics
set parametric
set urange [0:pi]; set vrange [0:2.0*pi]
set isosample 5,9
set size 0.7,1.0
set view 80,193
f(u,v)=sin(u)*cos(v)
g(u,v)=sin(u)*sin(v)
h(u,v)=cos(u)
set term pos eps enh 22
set out "bloch.eps"
splot f(u,v),g(u,v),h(u,v) lc rgb "gray10"
set out
set term pop

./xfig/bloch.png

色付き

splotより上に以下を加えると色が付く。

set pm3d
unset colorbox
## [black and white]
set palette defined (0 "gray10", 1 "white")
## [color]
# set palette defined (0 "#4444ff", 1 "#44ff44")
## [no surface]
# unset surface
# set palette defined (0 "#4444ff", 1 "#ff4444")
# set isosample 10,18

./xfig/bloch_bw.png ./xfig/bloch_col.png ./xfig/bloch_nosurf.png

90x pulse

π/2 pulse くらいなら gnuplot だけで描ける。

set label "|0{/Symbol \361}" at 0.1, 0, 1.15
set label "|1{/Symbol \361}" at 0.1, 0, -1.15
splot f(u,v),g(u,v),h(u,v) lc rgb "gray10", f(0.5*u,0.5*pi), g(0.5*u,0.5*pi), h(0.5*u,0.5*pi) lw 8 lc rgb "blue"

./xfig/bloch_col_90x.png

アニメーションを作る

rereadを使って簡単にアニメーションを作ることができる。
例えば、100行くらいのデータファイル(data.txt)

$ ruby -e 'include Math; puts (0..100).map{|x| "#{x}  #{sin(0.1*x)}"}' > data.txt

があるとき、

if (!exist("j")) j=0; set term png 24;\
   unset key; set xtics 0,50,100; set ytics -1.2,1.2,1.2

set out sprintf("fig/fig%03d.png",j)
plot [0:100][-1.2:1.2] "./data.txt" ev ::j::(j+10) t "" w l lw 8 lc rgb "#8888ff",\
     "" ev ::(j+10)::(j+10) w p pt 7 ps 4 lc rgb "blue"

if (j<90) j=j+1;reread

こんな感じのファイル(plot.gp)を用意して、gnuplotで実行した後ffmpegなどで処理すれば完成。

$ mkdir fig
$ gnuplot plot.gp
$ ffmpeg -i fig/fig%3d.png -vcodec libx264 -r 30 -g 150 -crf 20 -qmin 14 -qmax 41 -qdiff 4 -qcomp 0.4 -s 320x240 sin.mp4

凝ったことをするのなら "set out ...; plot ..." を並べたgnuplotのスクリプトを 適当なスクリプトで作ったほうが早い。

ラベルなどに日本語を使う

フォントの指定で日本語フォントを選ぶと良いらしい。

set xlabel 'x軸のラベル'
set term pos eps enh "Ryumin-Light-UniJIS-UTF8-H" 22

ファイルの文字コードはUTF-8で。

TeXのフォントを使う

使いたいフォントのpfb形式をfontfileで指定して、 {/フォント名 \xxx} とする。
文字コードはgnuplotのdocsにあるps_fontfile_doc.texを参照。

set pm3d map
set palette gray
set size square
set sample 100; set isosample 100
set xlabel 'パルス長エラーの大きさ {/CMMI10 \042}'
set ylabel '回転角 {/CMMI10 \265}'

set term pos eps enh "Ryumin-Light-UniJIS-UTF8-H" 22 fontfile "(cmmi10.pfbのある場所)/cmmi10.pfb"
set out "output.eps"
splot [-1:1][0:2*pi] abs(cos(0.5*x*y))
set out
set term pop

./xfig/gp_ja_sample.png


その他

EPSの余白を取り除く

$ epstool --copy -b input.eps output.eps

gnuplotでEPSを作っていて、あらかじめ適切なBounding Boxがわかっているなら、 gnuplotスクリプトの最後に

! sed -i 's/^\(%%BoundingBox:\)\( [0-9]\+\)\{4\}$/\1 100 100 200 200/' foo.eps

などと書いてsedで処理したほうが楽かもしれない。

EPSをPNGに変換

$ gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=png16m -dEPSCrop -r72 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile=foo.png foo.eps

あるいは

$ convert -density 72 foo.eps foo.png

背景を透過させるならデバイスをpngalphaにする。

$ gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pngalpha -dEPSCrop -r72 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile=foo.png foo.eps
top home

Date: 2013-07-08 02:35:44 JST

Author: Masamitsu Bando

Generated by Org version 7.9.4 with Emacs version 24