[R]グラフの隙間と余白

最近、Rでグラフを描くことが多かったりするのですが、デフォルトのままだと余白や変な隙間があってイマイチだったりします。私が主に不満に感じているのは下図に示した3点です。一つ目は余白が広すぎる事です。特に、キャプションをグラフ内に載せない場合には、上側の余白が広すぎます。二点目は、グラフと軸ラベルの間が少し広すぎて間抜けな印象を受けてしまうこと。三つ目は、グラフの軸が”xlim”や”ylim”で設定した範囲よりも若干広がっていて、特に図のように積分範囲をポリゴンで塗った場合には不自然さが際立ってしまいます。
既にこの辺りの設定方法は様々な解説記事がありますが、自分用のメモを兼ねて記事にしてみました。

Rのグラフの隙間と余白

まず、グラフの余白はパラメータ「mar」で設定します。marは長さ4の配列になっていて、mar[1]で下、mar[2]で左、mar[3]で上、mar[4]で右側の余白を設定します(下から時計回り)。

余白①:mar

次に、グラフの軸ラベルや軸目盛りの間隔設定は、パラメータ「mgp」で行います。mgpは長さ3の配列で、mgp[1]でグラフの枠から軸ラベルまでの距離、mgp[2]でグラフ枠から軸メモリまでの距離、mgp[3]でグラフ枠から軸までの距離を設定します。

余白②:mgp

最後に、グラフの範囲と”xlim”・”ylim”で設定した上下限との間に出来てしまう隙間の解消方法です。これは、グラフィックスパラメータ”xaxs”・”yaxs”で設定します。それぞれに”i”を設定すると隙間が無くなり、”r”を設定すると隙間が出来るようです。

上記の設定は、par関数で一括設定することが出来ます。

par(mar=c(3, 3, 1, 1)) #余白設定
par(mgp=c(2, 0.7, 0))  #グラフ枠と軸との間隔設定
par(xaxs = "i")        #データ範囲とグラフの範囲(X軸)
par(yaxs = "i")        #データ範囲とグラフの範囲(Y軸)

また、”mgp”と”xaxs”・”yaxs”はplotなどの高水準作図関数のパラメータでグラフ毎に設定する事が可能です。こうすることで、例えば複数のグラフを一枚(のデバイス:パラメータmfrow)に表示する場合には、それぞれのグラフに対して隙間の設定をすることが出来ます。

plot(x, y, 
 type="l", #線プロット
 xlim=c(-5,5), ylim=c(0,5), #範囲
 xaxs = "i", yaxs = "i",    #上記の範囲と軸を一致させる
 mgp=c(2, 0.7, 0)           #軸とグラフ枠との距離
)

最後に、二次関数の積分についてのグラフのコード全体を貼り付けておきます。

二次関数を積分したグラフ

#余白
par(mar=c(3, 3, 1, 1))
par(mgp=c(2, 0.7, 0))

#二次曲線
fParabola <- function(x, a=a, b=b, c=c) {
   return( a*x^2 + b*x + c )
}

#二次曲線のパラメータ
dA <- 0.1
dB <- 0
dC <- 1

#積分範囲
dMin <- -5
dMax <- 3

#折れ線グラフ
x <- seq(-10, 10, by=0.05)
y <- fParabola(x, a=dA, b=dB, c=dC)

plot(x, y, 
 type="l",
 xlab="X軸",
 ylab="Y軸",
 xlim=c(-5,5),
 ylim=c(0,5), xaxs = "i", yaxs = "i"
)


#積分範囲をポリゴンで
x <- seq(dMin, dMax, by=0.05)
y <- fParabola(x, a=dA, b=dB, c=dC)

polygon(c(dMin, x, dMax), c(0, y, 0), 
 col="gray"
)

この記事の作成に当たって下記のサイトを参考にさせて頂きました。

  1. 餡子付゛録゛
  2. R-Tips