GNUPLOT

- not so Frequently Asked Questions -

update 2004/9/5

2次元プロットのあれこれ (その2)

1 | 2 | 3 | 4 | 5 | 6 | 7

X=0, Y=0のゼロ軸を描きたい.

set {x|y}zeroaxis を使います.オプションを付けなければ, 線種0(点線)で描かれます.ls line_stle, lt line_type, lw line_width のオプションでゼロ軸の線種を変えることができます. 以下の例では lt -1 を使い, 枠線と同じ線を描いてみました.

gnuplot> set xzeroaxis lt -1
gnuplot> set yzeroaxis
fig/sample5.5
up

誤差棒の先に付く横線を消したい.

誤差付きのプロットをすると,誤差棒の先に小さな線が入ります. これを嫌う人も居ますし,データ点数が増えて来ると邪魔になったり します.これを消すには,次のようにします.

gnuplot> set bar 0

barの後の数字で線の長さを指定します.0にすれば線は表示されません.

なお, set pointsize で記号の大きさを変えても,この線の長さ は変わりませんので,記号と誤差の横棒のバランスを取りたければ,bar の値 も変えた方が良いでしょう.

gnuplot> set pointsize 3
gnuplot> set bar 3
up

文字を大きくしたい.

文字を大きくできるかどうかは,図を出力しようとしているデバイスに依 存します.labelやtitleの設定ではフォントを指定できますので,大きめのフォ ントが使えるのならそれでフォントを変更して大きくできますが,案外面倒な ものです.

出力をPostScriptにするなら,比較的簡単に文字を大きくできます.文字 を大きくするのではなくて,図を小さくするのです.フォントの大きさは変わ らないので,相対的に文字が大きくなります.PostScriptなら,印刷時に全体 を拡大できるので小さい図を作っても問題ありません.

gnuplot> set size 0.3,0.3
fig/sample5.7a

少々極端な例ですが,上のように図の大きさを縦横30%にしておきます. これで図を作り,EPSで出力します.これを再び拡大します.普通は,X,Yを 0.5〜0.7程度にしておくと,出来上がったEPSをLaTeXの文書に取り込んだ時に, 文字が潰れずにほど良い大きさになるようです.


同じくPostScript出力にてフォントを細かく指定したいならlabelやtitleの font optionを使って,使用するフォントとサイズを指定します. また, set terminal でのオプションで,基本のフォントサイズ を指定できます.以下の例では基本のフォントをヘルベチカの16ptとし, 表題と軸名にそれぞれ別のフォントとサイズを割り当てています.

gnuplot> set terminal postscript enhanced "Helvetica" 16
gnuplot> set title "Damping Function" font "Times-Roman,40"
gnuplot> set xlabel "X-AXIS" font "Helvetica,20"
gnuplot> set ylabel "Y-AXIS" font "Times-Italic,32"
gnuplot> plot exp(-x)
fig/sample5.7b

ただ,上にも書いていますが,gnuplotでここまで面倒なことをやる必要が あるかどうか,私としては疑問です.gnuplotはプロッターとして割り切り, 図を綺麗に飾りたいなら Tgifなどを使ったほうが,自分の好みに合う図を 作りやすいと思います.

up

データ点の間を滑らかな曲線で補間したい.

gnuplotには3次のSpline補間等によってデータ間を補間する機能がありま す.補間した曲線を表示するには,plotコマンドのオプションにあるsmoothを 使います.smoothには平滑方法を指定するオプションがあり,3次のスプライ ンやベジエ曲線を指定できます.スプラインはデータ点を必ず通る補間を行い ますが,ベジエだとデータ点を「制御点」とする曲線を引くので,データ点を 必ずしも通りません.

次の例では,3次スプラインとベジエでの補間を比較しています.データ 点と補間結果の曲線が区別しやすいように,初めにデータだけを記号で描き, 次に補間曲線をスプラインとベジエを指定して実線でプロットしています.

gnuplot> plot "test.dat" using 1:2 notitle with points, \
>             "test.dat" using 1:2 smooth csplines \
>                                  title "spline" with lines,\
>             "test.dat" using 1:2 smooth bezier \
>                                  title "bezier" with lines
fig/sample5.8a

スプライン関数のオプション csplines はデータ補間を行っていますが,ベジエ曲線を使う方法はデータを 平滑化するものであって補間で はありません.一方,スプライン関数をデータ平滑化に使うオプション acsplines もあり ,これによってデータの近似曲線を作成する方法もあ ります.上の例では,データのX,Yの値だけを使いましたが,近似曲線をひく には,各点の重み(誤差)を与える必要があります.以下は,誤差付きの実験デー タを,ベジエとスプラインで平滑化する方法です.

gnuplot> plot "test.dat" using 1:2:3 notitle with yerrorbars, \
>             "test.dat" using 1:2:3 smooth acsplines \
>                                    title "acsplines" with lines,\
>             "test.dat" using 1:2   smooth bezier \
>                                    title "bezier"    with lines
fig/sample5.8b

ベジエ曲線は,データの変化をかなり追随していますが,スプラインでは, 本当に大雑把なデータのトレンドを表しているのが分かると思います.データ のプロット中に曲線を"eye guide"で描き込むことはしばしば行われますが, gnuplotを使えばこの様な曲線が簡単に描けます.

スプラインによる近似曲線ではデータ点の重みが必要ですが,全データに 同じ重みをかけることもできます.この場合は, using 1:2:(1.0) のように3カラム目のデータとして常に1.0を使うようにします.

up

枠線上にあるデータ点を消したい.

枠線近くにあるデータや線分は,枠からはみ出さない様に切り取る(クリッ プする)ことができます. set clip は,データをどのようにクリッ ピングするかを制御します.clipにはpoints, one, two の3つのタイプがあり ます.少々分かりにくい話なので,次のような 5点のデータの例を使って説明 します.

#  X     Y
1.0   1.0
2.0   1.5
3.0   2.0
4.0   1.5
5.0   1.0

このデータを普通にpointsを使って表示すると,最初の点(X=1)と最後の点 (X=4)は図の隅に,真中の点は上の枠線上に表示されます.次の図は,分かり やすいように set pointsize 10 として,点を拡大したものです.

gnuplot> set pointsize 10
gnuplot> plot "test.dat" notitle with points
fig/sample5.9a

この例の様に,特に大きな記号で図を描いた場合は,枠上の点が煩わしくなります. クリップを指定すると,これらの点は消えます.


gnuplot> set clip points
gnuplot> plot "test.dat" notitle with points
fig/sample5.9b

クリップを指定した場合で,X=1,3,5でのデータが消えています.実は,デー タが枠線上に無くても,そこに近ければクリッピングが実行されます.上の例 でも,Y軸の上限を2.1まで広げても,X=3のデータは表示されません.どれく らい近付くと消えるのかは,良くわかりません.

クリップの次のタイプは set clip one で,描いている線が枠外にはみ出すときに,枠線付近でどのようにするかを 指示するものです.これはデフォルトで有効になっており, グラフは枠線に交わるところまで描かれます.これを無効にする( set noclip )と, 枠線と交わる線分が消されます.


「枠線と交わる線分」というのが分かりにくいかもしれません.gnuplot は,関数を表示するときに,sampling rateで指定されている数(標準では100 点)だけの座標値を計算し,その間を直線で結んでいきます.つまり,関数の 曲線を実際に描いているのではなく,小さな線分を繋げてそれらしく見せてい るわけです.座標点が枠の外にあると,この線分が枠線と交わります.この時 に,線分を全部消すか(noclip),枠と交わるまでを描くか(clip)を, set clip one で指示します.

y=sin(x)を使い,Yの範囲を[0:1]にして表示してみましょう.このとき,グラ フはX軸と何度か交わります.さらに, clip one をOFFにして比較します. 表示はlinespointsを使います.記号が描かれている部分が,gnuplot が座標を実際に計算した部分で,その間の線が,上で言う線分になります.

gnuplot> set clip one
gnuplot> plot sin(x) with linespoints
gnuplot> set noclip one
gnuplot> replot
fig/sample5.9c
clip one
fig/sample5.9d
noclip one

最後のクリップは set clip two です.これは clip oneの場合 と同様に,枠外に線分がはみ出したときの処理を指定するものですが,線分の 両端いづれもが枠の外にある場合のものです.標準ではclipです.あまりこ のような例は無いと思うのですが,無理矢理作るとすれば,次のようなもので しょうか.

gnuplot> set yrange [-0.5:0.5]
gnuplot> set samples 10
gnuplot> set clip two
gnuplot> plot sin(x) with linespoints
gnuplot> set noclip two
gnuplot> replot
fig/sample5.9e
clip two
fig/sample5.9f
noclip two

上の例のようにサンプリング数を極端に少なくすると,線分によっては, その両端がYの上限と下限の外側に来る時があります.この様な線分を描くか どうかが,clip twoによって変化します.

up