2016-03-24 13 views
19

Ho tre grafici e cerco di combinarli con grid.arrange. L'ultimo grafico dovrebbe avere un'altezza inferiore rispetto ai primi due grafici e tutti i grafici dovrebbero avere la stessa larghezza.Specificare le larghezze e le altezze dei grafici con grid.arrange

Un esempio di lavoro:

p1 <- qplot(mpg, wt, data=mtcars) 
p2 <- p1 
p3 <- p1 + theme(axis.text.y=element_blank(), axis.title.y=element_blank()) 

grid.arrange(arrangeGrob(p1,p2, ncol=1, nrow=2), 
     arrangeGrob(p3, ncol=1, nrow=1), heights=c(4,1)) 

enter image description here

Qui, l'ultima trama ha una larghezza maggiore rispetto alle prime due. Nei miei dati reali, anche se tengo il testo e il titolo sull'asse y, ho ancora una larghezza diversa per il terzo grafico.

Ho provato ad aggiungere "larghezze":

grid.arrange(arrangeGrob(p1,p2, ncol=1, nrow=2), 
     arrangeGrob(p3, ncol=1, nrow=1), heights=c(4,1), widths=c(2,1)) 

Ma si trasforma in una trama a due colonne ...

enter image description here

Ho provato anche un altro codice:

p1 <- ggplotGrob(p1) 
p2 <- ggplotGrob(p2) 
p3 <- ggplotGrob(p3) 
# 
stripT <- subset(p2$layout, grepl("spacer", p2$layout$name)) 
p3 <- p3[-stripT$t, ] 

grid.draw(rbind(p1, p2, p3, size = "first")) 

Ho le stesse larghezze ma ora non so come cambiare le altezze ...

enter image description here

Beh, qualcuno può aiutarmi a combinare sia l'altezza e la larghezza aspetti per una trama finale?

risposta

20

Prova plot_grid dal pacchetto cowplot:

library(ggplot2) 
library(gridExtra) 
library(cowplot) 
p1 <- qplot(mpg, wt, data=mtcars) 
p2 <- p1 
p3 <- p1 + theme(axis.text.y=element_blank(), axis.title.y=element_blank()) 
plot_grid(p1, p2, p3, align = "v", nrow = 3, rel_heights = c(1/4, 1/4, 1/2)) 

enter image description here

+0

Esattamente quello che stavo cercando, grazie mille! – Chika

5

con gtable è necessario impostare l'altezza dei pannelli manualmente,

g1 <- ggplotGrob(p1) 
g2 <- ggplotGrob(p2) 
g3 <- ggplotGrob(p3) 

library(gridExtra) 
g <- rbind(g1, g2, g3) 

set_panel_heights <- function(g, heights){ 
    g$heights <- grid:::unit.list(g$heights) # hack until R 3.3 comes out 
    id_panels <- unique(g$layout[g$layout$name=="panel", "t"]) 
    g$heights[id_panels] <- heights 
    g 
} 

g <- set_panel_heights(g, lapply(1:3, grid::unit, "null")) 
grid::grid.draw(g) 

enter image description here

Anche se un po 'prolisso, questo approccio è più generale di specificare altezze relative: potete mescolare tutti i tipi di unità di griglia,

grid::grid.newpage() 
g <- do.call(rbind, replicate(3, ggplotGrob(ggplot()), simplify = FALSE)) 
g <- set_panel_heights(g, list(unit(1,"in"), unit(1,"line"), unit(1,"null"))) 
grid::grid.draw(g) 

enter image description here

Problemi correlati