web-dev-qa-db-fra.com

Titre principal commun d'un panneau de figures compilé avec par (mfrow)

J'ai une compilation de 4 graphiques dessinés avec par(mfrow=c(2,2)). Je voudrais dessiner un titre commun pour les 2 graphiques ci-dessus et un titre commun pour les 2 panneaux ci-dessous qui sont centrés entre les 2 graphiques gauche et droit.

Est-ce possible?

46
ECII

Cela devrait fonctionner, mais vous aurez besoin de jouer avec l'argument line pour le faire correctement:

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 signifie "texte de marge". side = 3 Dit de le placer dans la marge "supérieure". line = -21 Dit de compenser le placement de 21 lignes. outer = TRUE Dit qu'il est OK d'utiliser la zone de marge extérieure.

Pour ajouter un autre "titre" en haut, vous pouvez l'ajouter en utilisant, par exemple, mtext("My 'Title' in a strange place", side = 3, line = -2, outer = TRUE)

46

Vous pouvez utiliser la fonction layout() et définir deux régions de traçage qui se produisent dans les deux colonnes (voir les numéros répétitifs 1 et 3 dans la matrix()). Ensuite, j'ai utilisé plot.new() et text() pour définir les titres. Vous pouvez jouer avec des marges et des hauteurs pour obtenir une meilleure représentation.

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

La même chose mais en gras peut être effectuée en utilisant title(...) avec les mêmes arguments que ci-dessus:

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

Voici une autre façon de le faire, en utilisant la fonction line2user De cet article .

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

Ici, le titre est positionné 2 lignes plus haut que le bord supérieur du tracé, comme indiqué par line2user(2, 3). Nous le centrons en le décalant par rapport aux 2e et 4e parcelles, de la moitié de la largeur combinée des marges gauche et droite, c'est-à-dire mean(par('mar')[c(2, 4)]).


line2user Exprime un décalage (nombre de lignes) à partir d'un axe en coordonnées utilisateur, et est défini comme:

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