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?
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)

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)
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)

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)
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)

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))
}