Título principal común de un panel de figuras compilado con par (mfrow)


Tengo una compilación de 4 parcelas dibujadas junto con par(mfrow=c(2,2)). Me gustaría dibujar un título común para los 2 gráficos anteriores y un título común para los 2 paneles inferiores que se centran entre los 2 gráficos izquierdo y derecho.

Es esto posible?

Author: ECII, 2013-02-02

4 answers

Estodebería funcionar, pero tendrás que jugar con el argumento line para hacerlo bien:

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)

introduzca la descripción de la imagen aquí

mtext significa "texto de margen". side = 3 dice colocarlo en el margen "superior". line = -21 dice para compensar la colocación por 21 líneas. outer = TRUE dice que está bien usar el área del margen exterior.

Para agregar otro "título" en la parte superior, puede agregarlo usando, por ejemplo, mtext("My 'Title' in a strange place", side = 3, line = -2, outer = TRUE)

 37
Author: A5C1D2H2I1M1N2O1R2T1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-02 09:42:38

Puede usar la función layout() y establecer dos regiones de trazado que se producen en ambas columnas (ver los números repetidos 1 y 3 en el matrix()). Luego usé plot.new() y text() para establecer títulos. Puedes jugar con márgenes y alturas para obtener una mejor representación.

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)

introduzca la descripción de la imagen aquí

 31
Author: Didzis Elferts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-02 09:37:02

Lo mismo pero en negrita se puede hacer usando title(...) con los mismos argumentos que los anteriores:

title("My 'Title' in a strange place", side = 3, line = -21, outer = TRUE)
 11
Author: Ufos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-19 01:39:06

Aquí hay otra forma de hacerlo, usando la función line2user de este post.

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

Aquí, el título se coloca 2 líneas más arriba que el borde superior de la parcela, como se indica por line2user(2, 3). Lo centramos compensándolo con respecto a las parcelas 2a y 4a, por la mitad del ancho combinado de los márgenes izquierdo y derecho, es decir, mean(par('mar')[c(2, 4)]).


line2user expresa un desplazamiento (número de líneas) de un eje en coordenadas de usuario, y se define como:

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))
}
 6
Author: jbaums,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:55:04