読者です 読者をやめる 読者になる 読者になる

余白の書きなぐり

aueweのブログ

Gnuplot で複数のグラフを並べる方法

Gnuplot

バンド図 なんかを描く際に、 いくつかのグラフを横に並べて描画したくなる。 あるいは数種類の量を比較するなら、縦に並べたくなるだろう。 そういう時には Gnuplotのコマンド set multiplot を使用して複数枚のグラフを並べれば良いのだが、 いくつかハマりどころがある。

f:id:auewe:20130517212913p:plain

# set size と set origin でグラフの位置を調整する
# 余白は全て0にする (こうしないとグラフサイズが意図せず変更される)
set lmargin 0
set rmargin 0
set tmargin 0
set bmargin 0

# multiplotする前に yrangeを指定
set yrange [0:4]
set multiplot

# 左のグラフ
set title "直線"
set size   0.2 , 0.8
set origin 0.1 , 0.1
set xrange [0:1]
set xtics ('0' 0, '0.5' 0.5, '1' 1)
set ytics ('0' 0, '1' 1,'2' 2,'3' 3,'4' 4)
plot x

# 右のグラフ
set title "放物線"
set size   0.6 , 0.8
set origin 0.3 , 0.1
set xrange [1:4]
set xtics ('1' 1,'2' 2,'3' 3,'4' 4)
set ytics ('' 0,'' 1,'' 2,'' 3,'' 4)
plot (x-2)**2

set nomultiplot

pause -1

注意点まとめ

  1. マージンは全て0に設定する
  2. グラフの位置は sizeorigin で指定する
  3. xrange, yrange の指定を省略しない
  4. 一番左のグラフで ytics を設定する

注意点1 マージンを0に設定

たとえば set lmargin 10 とした場合、 グラフのサイズが予期せず変更される。 左右のグラフ共に set size 0.5 , 1 と設定しているにもかかわらず、 左のグラフが右のグラフより横長になるといった怪現象が発生するので、マージンは常に0にしよう。

注意点2 size と origin で位置指定

以下の図では、外側の黒枠が画像の端を表しており、 内側の黒線が左右のグラフを表している。 横方向の数字(赤色)と縦方向の数字(青色)は、 画像の端から端まで距離との比を表していて、距離そのものではない。 つまり赤の0.1と青の0.1は異なる長さなので注意。 緑の玉は各グラフの原点 (origin) を表している。

f:id:auewe:20130517212931p:plain

二枚のグラフがくっつくようにサイズと原点を設定する。

# 左のグラフ
set size   0.2 , 0.8
set origin 0.1 , 0.1
# 右のグラフ
set size   0.6 , 0.8
set origin 0.3 , 0.1

注意点3 range を設定する

全てのグラフについて設定するのを忘れないようにする。 特に set yrange を忘れがち。 これを省略すると、例えば

  • 左のグラフの上端が y=0 下端が y=1
  • 右のグラフの上端が y=0 下端が y=4

といった不条理が発生する。

注意点4 左のグラフで set ytics する

こうしないと図の真ん中に y軸のメモリ数字が出てきて気持ち悪い。


参考サイト : 2次元プロットのあれこれ (その6) ..... このサイトではグラフの位置調整に margin を使ってるけど、使わない方がいいと思う。