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