two top plots other one multiple merging many ggplot arrange r plot ggplot2 gridextra

top - Especifique los anchos y las alturas de las parcelas con grid.arrange



merging plots in r (2)

Tengo tres parcelas e intento combinarlas con grid.arrange. El último diagrama debe tener una altura menor que las dos primeras parcelas y todas las parcelas deben tener el mismo ancho.

Un ejemplo de trabajo:

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

Aquí, el último diagrama tiene un ancho mayor que los dos primeros. En mis datos reales, incluso si conservo el texto y el título en el eje y, todavía tengo un ancho diferente para el tercer gráfico.

Traté de agregar "anchos":

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

Pero se convierte en una trama de dos columnas ...

También probé otro código:

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

Tengo el mismo ancho pero ahora no sé cómo cambiar las alturas ...

Bueno, ¿alguien me puede ayudar a combinar los aspectos de altura y ancho para una trama final?


Pruebe plot_grid desde el paquete 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))


con Gtable, necesita configurar las alturas de los paneles 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)

Aunque es un poco detallado, este enfoque es más general que la especificación de alturas relativas: puede mezclar todo tipo de unidades de grillas,

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)