it-roy-ru.com

Общий основной заголовок панели рисунков, составленный с помощью par (mfrow)

У меня есть компиляция из 4 графиков, нарисованных вместе с par(mfrow=c(2,2)). Я хотел бы нарисовать общий заголовок для 2 вышеупомянутых графиков и общий заголовок для 2 ниже панелей, которые расположены по центру между 2 левым и правым графиками.

Это возможно?

46
ECII

Это должно работает, но вам нужно поэкспериментировать с аргументом 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
A5C1D2H2I1M1N2O1R2T1

Вы можете использовать функцию layout() и ​​установить две области построения, которые встречаются в обоих столбцах (см. Повторяющиеся номера 1 и 3 в matrix()). Затем я использовал 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

Вот еще один способ сделать это, используя функцию _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

Здесь заголовок располагается на 2 строки выше верхнего края графика, как указано line2user(2, 3). Мы центрируем его, смещая его относительно 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