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

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

Est-ce possible?

41
demandé sur ECII 2013-02-02 13:13:34

4 réponses

Ce devrait fonctionner, mais vous devrez jouer avec l'argument line pour l'obtenir 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)

entrez la description de l'image ici

mtext signifie "texte de la 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 à l'aide, par exemple, mtext("My 'Title' in a strange place", side = 3, line = -2, outer = TRUE)

37
répondu A5C1D2H2I1M1N2O1R2T1 2013-02-02 09:42:38

Vous pouvez utiliser la fonction layout() et définir deux régions de traçage qui se produisent dans les deux colonnes(voir les nombres répétitifs 1 et 3 dans le matrix()). Ensuite, j'ai utilisé plot.new() et text() pour définir les titres. Vous pouvez jouer avec les marges et les 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)

entrez la description de l'image ici

31
répondu Didzis Elferts 2013-02-02 09:37:02

Le même mais en gras peut être fait en utilisant title(...) avec les mêmes arguments que ci-dessus:

title("My 'Title' in a strange place", side = 3, line = -21, outer = TRUE)
11
répondu Ufos 2015-06-19 01:39:06

Voici une autre façon de le faire, en utilisant la fonction line2user de ce 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

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 compensant par rapport aux 2ème et 4ème 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) par rapport à un axe en coordonnées utilisateur et est défini comme suit:

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
répondu jbaums 2017-05-23 11:55:04