subplots plots one multiple many graphs ggplot ggarrange arrange r ggplot2 gridextra

plots - subplot r ggplot



ggplot2 y gridExtra: elimina completamente la tira en facet_grid, no solo invisible (4)

Aquí otra solución usando viewport y grid.layout . Crea 2 vistas con 2 diseños diferentes. Luego coloco los gráficos ggplot2 usando el argumento vp.

library(grid) pushViewport(plotViewport(c(1,1,1,1),layout = grid.layout(2, 1))) print(p2, vp = viewport(layout.pos.row = 2, layout.pos.col = 1)) pushViewport(viewport(layout.pos.row=1, layout = grid.layout(1, 2,widths = unit(c(1,1),c("null",''lines''))))) print(p1, vp = viewport(layout.pos.row = 1, layout.pos.col = 1)) upViewport(2)

Tengo dos gráficos que estoy colocando uno encima del otro, de la siguiente manera:

library(ggplot2) library(gridExtra) p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() p2 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() p2 <- p2 + facet_grid(cyl ~ .) grid.arrange(p1, p2, ncol=1)

Para esto necesito los ejes x de los gráficos superior e inferior para alinearse, sin embargo, debido a la tira a la izquierda, el gráfico facetado es más estrecho que el gráfico superior. Puedo hacer la tira invisible usando:

theme(strip.text.y = element_blank()) theme(strip.background = element_blank())

Sin embargo, esto no elimina el espacio que ocupa la tira. Entonces, o bien necesito una forma de deshacerme de la tira por completo, o tengo una manera de dividir mi gráfico facetado en gráficos separados, pero de alguna manera compartiendo la misma etiqueta del eje y a través de ellos. En mi gráfico tengo dos paneles facetados que no son muy altos, y no hay suficiente espacio para que cada uno tenga un eje y de tamaño decente.

¿Alguna sugerencia?


Mi solución sería encontrar el ancho de la tira y luego establecer los márgenes de ambas gráficas en cero, pero reducir el tamaño de la tira para que sea un poco más pequeño (el ancho de la tira) para que parezca ser del mismo tamaño. Por prueba y error parece que la franja tiene alrededor de 0.5 líneas de ancho (pero supongo que podrías resolver esto programáticamente). Por lo tanto, solo asegúrese de que el margen de trazado correcto en el trazado sin el texto de la tira sea 0.5 líneas mayor que el de la tira invisible:

# Add a line of width 0.5 on the left but set all other margins to zero p1 <- p1 + theme( plot.margin = unit( c(0,0.5,0,0) , units = "lines" ) ) # Set all margins to zero, the strip will take up a phantom amount of invisible space p2 <- p2 + theme(strip.text.y = element_blank() , strip.background = element_blank(), plot.margin = unit( c(0,0,0,0) , units = "lines" ) ) grid.arrange(p1, p2, ncol=1)

Obviamente, puede ajustar los márgenes como desee (por ejemplo, agregue 1 a la primera posición en cada vector numérico en plot.margin para obtener un borde de una línea a lo largo de la parte superior de cada gráfico), siempre que mantenga 0.5 líneas más de margen en En el borde derecho de la segunda parcela se verán iguales.


Otra solución usando funciones del paquete gtable . Alinea los gráficos pero mantiene el texto de la tira. Utiliza una función de gtable para insertar una columna a la derecha de p1 igual al ancho del texto de la tira de p2 .

library(ggplot2) library(gridExtra) library(gtable) p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() p2 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() p2 <- p2 + facet_grid(cyl ~ .) g1 = ggplotGrob(p1) # gtable_show_layout(g1) # View the layout # g1$widths # Get the widths of g1 g2 = ggplotGrob(p2) # gtable_show_layout(g2) # View the layout # g2$widths # Check the widths of g2 # Add new column to the right of g1 equal in width the strip width of g2. # In g2, strip width is the 6th element the vector g2$widths g1 <- gtable_add_cols(g1, g2$widths[6]) grid.arrange(g1, g2, ncol=1)

## But note that if the y-axis titles and/or labels take up different widths, # the two plots are not aligned p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() + theme(axis.title.y = element_text(vjust = .5, angle = 0, size = 30)) p2 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() p2 <- p2 + facet_grid(cyl ~ .) g1 = ggplotGrob(p1) g2 = ggplotGrob(p2) g1 <- gtable_add_cols(g1, g2$widths[6]) # New column added to the right grid.arrange(g1, g2, ncol=1) # Plots are not aligned

# Need to set widths to the maximums in the two plots, # i.e., set g2 widths to be the same as g1 widths g2$widths <- g1$widths grid.arrange(g1, g2, ncol=1) # Plots are aligned

EDITAR: O como lo sugiere baptiste, use la gtable rbind() :

g1 = ggplotGrob(p1) g2 = ggplotGrob(p2) g1 <- gtable_add_cols(g1, g2$widths[6], 5) # New column added to the right library(grid) grid.draw(rbind(g1, g2, size = "first"))


También puede hacerlo de esta manera y conservar los títulos de la tira, lo que sería información pertinente:

library(ggplot2) library(gridExtra) p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() + xlab(NULL) p2 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() + facet_wrap( ~ cyl, ncol = 1) grid.arrange(p1, p2, ncol=1)