web-dev-qa-db-ja.com

par(mfrow)でコンパイルされたFigureパネルの共通メインタイトル

par(mfrow=c(2,2))と共に描画された4つのプロットの編集物があります。上の2つのプロットに共通のタイトルを、2つの左と右のプロットの中央にある下の2つのパネルに共通のタイトルを描画したいと思います。

これは可能ですか?

46
ECII

これはshouldは機能しますが、line引数をいじって適切なものにする必要があります。

_par(mfrow = c(2, 2))
plot(iris$Petal.Length, iris$Petal.Width)
plot(iris$Sepal.Length, iris$Petal.Width)
plot(iris$Sepal.Width, iris$Petal.Width)
plot(iris$Sepal.Length, iris$Petal.Width)
mtext("My 'Title' in a strange place", side = 3, line = -21, outer = TRUE)
_

enter image description here

mtextは「マージンテキスト」を表します。 _side = 3_は、「トップ」マージンに配置するように指示します。 _line = -21_は、配置を21行オフセットすることを示します。 _outer = TRUE_は、外側のマージン領域を使用してもかまいません。

上部に別の「タイトル」を追加するには、mtext("My 'Title' in a strange place", side = 3, line = -2, outer = TRUE)などを使用して追加できます

46

関数layout()を使用して、両方の列で発生する2つのプロット領域を設定できます(matrix()の繰り返し番号1と3を参照)。次に、plot.new()text()を使用してタイトルを設定しました。より良い表現を得るために、マージンと高さで遊ぶことができます。

x<-1:10
par(mar=c(2.5,2.5,1,1))
layout(matrix(c(1,2,3,4,1,5,3,6),ncol=2),heights=c(1,3,1,3))
plot.new()
text(0.5,0.5,"First title",cex=2,font=2)
plot(x)
plot.new()
text(0.5,0.5,"Second title",cex=2,font=2)
hist(x)
boxplot(x)
barplot(x)

enter image description here

32
Didzis Elferts

上記と同じ引数でtitle(...)を使用して、同じことを太字で行うことができます。

title("My 'Title' in a strange place", line = -21, outer = TRUE)
12
Ufos

this post の_line2user_関数を使用して、別の方法でこれを行います。

_par(mfrow = c(2, 2))
plot(runif(100))
plot(runif(100))
text(line2user(line=mean(par('mar')[c(2, 4)]), side=2), 
     line2user(line=2, side=3), 'First title', xpd=NA, cex=2, font=2)

plot(runif(100))
plot(runif(100))
text(line2user(line=mean(par('mar')[c(2, 4)]), side=2), 
     line2user(line=2, side=3), 'Second title', xpd=NA, cex=2, font=2)
_

centered_titles

ここでは、line2user(2, 3)で示されるように、タイトルはプロットの上端より2行上に配置されます。 2番目と4番目のプロットに対して、左マージンと右マージンを合わせた幅の半分、つまりmean(par('mar')[c(2, 4)])でオフセットすることにより、中央に配置します。


_line2user_は、ユーザー座標の軸からのオフセット(行数)を表し、次のように定義されます。

_line2user <- function(line, side) {
  lh <- par('cin')[2] * par('cex') * par('lheight')
  x_off <- diff(grconvertX(0:1, 'inches', 'user'))
  y_off <- diff(grconvertY(0:1, 'inches', 'user'))
  switch(side,
         `1` = par('usr')[3] - line * y_off * lh,
         `2` = par('usr')[1] - line * x_off * lh,
         `3` = par('usr')[4] + line * y_off * lh,
         `4` = par('usr')[2] + line * x_off * lh,
         stop("side must be 1, 2, 3, or 4", call.=FALSE))
}
_
7
jbaums