GNUPLOT

- not so Frequently Asked Questions -

update 2004/9/5

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

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

表示方法の異なる2つの図を横または縦に並べる.

同じデータの図を,表示方法を変えて,横または縦に並べる方法を紹介します. 次のような場合に,このような表示が役に立ちます.

  • 同じデータを表示スケールを変えて横に並べる.
    • Xのある特定の範囲を引き伸ばして表示したいとき.例えば,Xの値 が小さい部分だけを対数表示して拡大し,横に並べて1枚の図とす る.
  • 2つの似通ったデータを絶対値と比で比較する.
    • Y値が非常に接近した2つのデータを重ねてプロットすると,2つの グラフは重なってしまい判別ができなくなります.2つのデータが 非常に似ているという事を示したいだけなら,重なってしまうのは, さほど悪いことではありません.ただ,どの程度重なっているのか を定量的に示したいのなら,それらの比をとり,ratio=1からどれ だけ離れているかを表示すると良いです.ここでは,1つの図を上 下に分け,上半分に2つのデータを絶対値で表示し,下部にそれら の比をプロットします.

up

同じデータを表示スケールを変えて横に並べる.

fig/sample5.16a

左のようなデータがあるとします.ここでの表示範囲は,[0:30]となってい ますが,Xが0に近い場所に意味があり,ここをより詳細に見せたい場合が あります.2つの図を異なるスケールで描けば良いのですが,これを1つの 図にまとめる方法を考えます.まず,Xが1以下の領域を対数表示します.


gnuplot> set log xy
gnuplot> set xrange [ 0.001 : 1 ]
gnuplot> set yrange [ 0.1 : 5000 ]
gnuplot> set xlabel "Energy [eV]"

Xが[1:30]の領域はlinear scaleで表示し,1以下の対数表示の図の横に multiplotを使って並べます.左右の図をぴったりとくっつける ために,左側ではrmarginをゼロにし,右の図では lmarginをゼロにします.2つの図の横幅を半分にしておき, set originを用いて右の図を0.5だけ右に移動します.

左側の図にはY目盛を入れるため, set lmargin 10 としてY軸の 数字を書く10文字分の領域を確保していますが,右側の図には数字を入れ ないのでlmarginをゼロにします.また 数字を消すために set format ""を指定します.

gnuplot> set multiplot
multiplot> set size 0.5,1
multiplot> set origin 0.0,0.0
multiplot> set lmargin 10
multiplot> set rmargin 0
multiplot> plot "calc.dat" u 1:2 w l
multiplot> set origin 0.5,0.0
multiplot> set format y ""
multiplot> set lmargin 0
multiplot> set rmargin 2
multiplot> set nolog x
multiplot> set xrange [1:30]
multiplot> set xtic 0,10
multiplot> set mxtic 5
multiplot> plot "calc.dat" u 1:2 w l
multiplot> set nomultiplot
gnuplot>
fig/sample5.16b

左側と右側のスケールが違うことを明確にするために,X軸にはminor tics をいれておくべきです.また,繋ぎ目でのXの目盛の数値が重なってしまわ ないように,右の図ではset xtics 0,10(初期値0,増分10)とし てX=1のところに目盛が入らないようにしました.

実は,このデータはXが小さい場合にlog-logで直線になることが分かってい ます.上の図と比較するとわかるように,表示領域を2つにわけることで, このようなデータの特徴を端的に表現することが可能になります.


この例ではX軸名が2つ表示されますが,2つの図の真中近辺に1つだけ表示さ せることもできます.左の図では set xlabel ""のように軸名 を消しておき,右側の軸名を set xlabel "Energy [eV]" -20,0 のように左にずらします.この時,両方の図で, set bmargin 5 のように下部のマージンを明示しておかないと,軸名を消した方の図の縦 の長さが変わってしまいます.


up

2つの似通ったデータを絶対値と比で比較する.

非常に似通った2つのデータを比較検討するには,絶対値での比較の他にそ れらの比を取ったものをプロットするのが効果的です.同じX座標でのY値 の比なので,今度は上下に図を重ねてみます.絶対値での比較は対数表示, 比は通常の目盛を使います.

2つのデータのX座標を揃えておかないと,比を計算することはできませんの で,データファイルには,1カラム目にX座標,2カラムが最初のデータのY 座標,3カラム目が2番目のデータのY座標が入っているものとします.

最初に設定するのは,上下の図に共通なX軸関係のパラメータです.ここで は,[0.01:30]の範囲を対数表示を用いてプロットします.上下の図の大き さをそろえるために,leftとrightのマージンを明示しています.

gnuplot> set xrange [ 0.01 : 30 ]
gnuplot> set nokey
gnuplot> set log x
gnuplot> set xtics 10
gnuplot> set mxtics 10
gnuplot> set lmargin 10
gnuplot> set rmargin 2

まず下側の図を作ります.下には2つのデータの比をとったものを,縦サイ ズを0.4に縮小して表示します.Y軸の範囲は0.5から1.5とし,目盛は0.6か ら0.2刻みで1.4まで入れます.X軸名は下の図に入れるので, set bmargin で軸名のスペースを確保します.また,上の図と接触させる ために, set tmargin 0 で上部の余白を無くします.2つのデー タは2,3カラムにあるので,その比をプロットするには plot 1:($2/$3) となります.Y=1を入れておくと,比のデータはより読み やすくなります.

gnuplot> set multiplot
multiplot> set yrange [ 0.5 : 1.5 ]
multiplot> set ytic 0.6,0.2,1.4
multiplot> set ylabel "Ratio"
multiplot> set size 1,0.4
multiplot> set xlabel "Energy [eV]"
multiplot> set origin 0.0,0.0
multiplot> set bmargin 3
multiplot> set tmargin 0
multiplot> plot 1 w l 0,"cross.dat" u 1:($2/$3) w l 1

次に上半分を作ります.下と同様にサイズを縮小した後,下の図の左上に移 動に原点を移動します.上側では,2つのデータを絶対値の対数で表示して います.set bmargin 0で下の図と接触させます.その時,X軸名 や数字は消しておく必要があります.

multiplot> set log xy
multiplot> set yrange [ 0.1 : 5000 ]
multiplot> set ytic 0.1,10
multiplot> set ylabel "Cross Section [b]"
multiplot> set size 1,0.6
multiplot> set origin 0.0,0.4
multiplot> set bmargin 0
multiplot> set tmargin 1
multiplot> set format x ""
multiplot> set xlabel ""
multiplot> plot "cross.dat" u 1:2 w l,"" u 1:3 w l
multiplot> set nomultiplot
gnuplot> 
fig/sample5.16c

ここでは凡例を消していますので,比のデータがA/Bなのか,B/Aなのかはす ぐには分かりません.必要があります.上半分の図を見れば,赤い線が緑 線より低いので,下のratioは赤/緑であることは明らかですが,やはりこ れはcaption中に明記する必要があります.

EPSに出力した完成品がGalleryにあります.


up