2016-12-09 3 views
4

je dois organiser deux graphiques facettes, comme ceci:ggplot2 top align de deux parcelles facettées

d = data.frame(Index = LETTERS[1:5],x=1:5,y=1:5) 
A = ggplot(subset(d,Index == 'A'),aes(x,y)) + 
    theme_bw() + 
    theme(axis.title.x = element_blank()) + 
    geom_point() + facet_wrap(~Index) + labs(title = "Title, The Title", 
              subtitle = "Subtitle, The Subtitle", 
              y = "Side Axes") 
B = ggplot(subset(d,Index != 'A'),aes(x,y)) + 
    theme_bw() + 
    theme(axis.title.x = element_blank(), axis.title.y = element_blank()) + 
    geom_point() + facet_wrap(~Index) + labs(title = "", subtitle = "") 
g = gridExtra::arrangeGrob(A,B,ncol=2,bottom="Bottom Axes") 
grid.arrange(g) 

qui produit les éléments suivants:

Output

Comme vous pouvez le voir ci-dessus, il y a un léger désalignement entre les bords supérieurs de la région de l'intrigue. Ceci est causé par les 'virgules' dans le titre et les sous-titres.

Est-ce que quelqu'un sait comment je peux appliquer les bords supérieurs à aligner? J'ai besoin d'un titre et d'un sous-titre sur l'intrigue de gauche, avec un titre (vide), sous-titre sur le droit.

+0

définir les marges, par exemple 'theme (plot.margin = unité (c (.3, .2, .15, .2), 'cm'))' – alistaire

Répondre

4

@ La solution de CephBirk est un moyen intelligent et facile d'y accéder. Pour les cas où un tel bidouillage ne fonctionne pas, vous pouvez supprimer le titre et le sous-titre de vos graphiques et créer à leur place des grobs séparés que vous pouvez afficher, avec les graphiques, en utilisant grid.arrange et arrangeGrob. Dans le code ci-dessous, j'ai également ajouté un nullGrob() comme espacement entre les tracés A et B, de sorte que le droit x-label (1.50) dans le graphique de gauche n'est pas coupé.

library(gridExtra) 

A = ggplot(subset(d,Index == 'A'),aes(x,y)) + 
    theme_bw() + 
    theme(axis.title = element_blank()) + 
    geom_point() + facet_wrap(~Index) 

B = ggplot(subset(d,Index != 'A'),aes(x,y)) + 
    theme_bw() + 
    theme(axis.title.x = element_blank(), axis.title.y = element_blank()) + 
    geom_point() + facet_wrap(~Index) 

grid.arrange(
    arrangeGrob(
    arrangeGrob(textGrob("Title, The Title", hjust=0), 
       textGrob("Subtitle, The Subtitle", hjust=0, gp=gpar(cex=0.8))), 
    nullGrob(), ncol=2, widths=c(1,4)), 
    arrangeGrob(A, nullGrob(), B, ncol=3, widths=c(8,0.1,8), 
       left="Side Axes", bottom="Bottom Axes"), 
    heights=c(1,12)) 

enter image description here

+0

C'est la solution parfaite. Merci. –

2

C'est un peu hackish, mais vous pouvez avoir le même titre et le même sous-titre sur la droite que sur la gauche mais l'imprimer en blanc. :) Vous avez dit que c'était à cause des virgules, donc ça le corrige.

Pas le plus satisfaisant, mais il fait le travail.

B = ggplot(subset(d,Index != 'A'),aes(x,y)) + 
theme_bw() + 
theme(axis.title.x = element_blank(), axis.title.y = element_blank(), title = element_text(color = 'white')) + 
geom_point() + facet_wrap(~Index) + 
labs(title = "Title, The Title", subtitle = "Subtitle, The Subtitle") 
+0

J'ai effectivement pensé à ceci ....., c'est un peu trop pirater à mon goût. –

+0

une autre option est d'utiliser labs (title = expression (fantôme ("Titre, Le titre")), sous-titre = expression (fantôme ("Subtitle, The Subtitle"))) (et aussi utiliser expression() pour A, sans 'fantôme()'). – baptiste

2
egg::ggarrange(A, B, ncol=2, bottom="Bottom Axes") 

enter image description here

+0

Merci. A l'air très utile en effet! –