titles how ggplot changing r ggplot2

how - label axis in ggplot2 r



Alinear áreas de parcelas en ggplot (5)

Ese es exactamente el tipo de problema para el que escribí el paquete cowplot . Se puede hacer en una línea en ese paquete:

require(cowplot) # loads ggplot2 as dependency # re-create the four plots A <- c(1,5,6,7,9) B <- c(10,56,64,86,98) C <- c(2001,3333,5678,4345,5345) D <- c(13446,20336,24333,34345,42345) L <- c(20,34,45,55,67) M <- data.frame(L, A, B, C, D) x1 <- ggplot(M, aes(L, A,xmin=10,ymin=0)) + geom_point() + stat_smooth(method=''lm'') x2 <- ggplot(M, aes(L, B,xmin=10,ymin=0)) + geom_point() + stat_smooth(method=''lm'') x3 <- ggplot(M, aes(L, C,xmin=10,ymin=0)) + geom_point() + stat_smooth(method=''lm'') x4 <- ggplot(M, aes(L, D,xmin=10,ymin=0)) + geom_point() + stat_smooth(method=''lm'') # arrange into grid and align plot_grid(x1, x2, x3, x4, align=''vh'')

Este es el resultado: (Tenga en cuenta que cowplot cambia el tema ggplot2 predeterminado. Puede recuperar el gris si realmente quiere).

Como característica adicional, también puede agregar etiquetas de trazado en la esquina superior izquierda de cada gráfico:

plot_grid(x1, x2, x3, x4, align=''vh'', labels=c(''A'', ''B'', ''C'', ''D''))

Resultado:

Utilizo la opción de labels en prácticamente todos los gráficos de varias partes que hago.

Estoy tratando de usar grid.arrange para mostrar múltiples gráficos en la misma página generada por ggplot. Las gráficas utilizan los mismos datos x pero con diferentes variables y. Las gráficas salen con diferentes dimensiones debido a que los datos y tienen diferentes escalas.

He intentado usar varias opciones de tema dentro de ggplot2 para cambiar el tamaño del gráfico y mover la etiqueta del eje y, pero ninguno ha trabajado para alinear los gráficos. Quiero que las parcelas estén dispuestas en un cuadrado de 2 x 2 para que cada parcela sea del mismo tamaño y se alineen los ejes x.

Aquí hay algunos datos de prueba:

A <- c(1,5,6,7,9) B <- c(10,56,64,86,98) C <- c(2001,3333,5678,4345,5345) D <- c(13446,20336,24333,34345,42345) L <- c(20,34,45,55,67) M <- data.frame(L, A, B, C, D)

Y el código que estoy usando para trazar:

x1 <- ggplot(M, aes(L, A,xmin=10,ymin=0)) + geom_point() + stat_smooth(method=''lm'') x2 <- ggplot(M, aes(L, B,xmin=10,ymin=0)) + geom_point() + stat_smooth(method=''lm'') x3 <- ggplot(M, aes(L, C,xmin=10,ymin=0)) + geom_point() + stat_smooth(method=''lm'') x4 <- ggplot(M, aes(L, D,xmin=10,ymin=0)) + geom_point() + stat_smooth(method=''lm'') grid.arrange(x1,x2,x3,x4,nrow=2)

Si ejecuta este código, verá que las dos parcelas inferiores tienen un área de trazado más pequeña debido a la mayor longitud de las unidades de los ejes y.

¿Cómo hago que las ventanas reales de la trama sean iguales?


Si está utilizando RMarkdown y tejer en PDF, tengo un enfoque alternativo. Knitr ofrece la funcionalidad para trazar subfiguras al crear un PDF, lo que le permite tener varias figuras en un diagrama, cada una con su propio título.

Para que esto funcione, cada gráfico debe visualizarse por separado. Al unir varias funciones del paquete cowplot , realicé la siguiente función que alinea gráficos mientras los mantiene como objetos separados:

plot_grid_split <- function(..., align = "hv", axis= "tblr"){ aligned_plots <- cowplot::align_plots(..., align=align, axis=axis) plots <- lapply(1:length(aligned_plots), function(x){ cowplot::ggdraw(aligned_plots[[x]]) }) invisible(capture.output(plots)) }

Aquí hay un ejemplo, comparando el diseño normalmente con la función:

--- output: pdf_document header-includes: - /usepackage{subfig} --- ```{r} plot_grid_split <- function(..., align = "hv", axis= "tblr"){ aligned_plots <- cowplot::align_plots(..., align=align, axis=axis) plots <- lapply(1:length(aligned_plots), function(x){ cowplot::ggdraw(aligned_plots[[x]]) }) invisible(capture.output(plots)) } ``` ```{r fig-sub, fig.cap=''Four Plots Not Aligned'', fig.subcap=c(''Plot One'', ''Plot Two'', ''Plot Three'', ''Plot Four''), out.width=''.49//linewidth'', fig.asp=1, fig.ncol = 2} library(ggplot2) plot <- ggplot(iris, aes(Sepal.Length, Sepal.Width, colour = Species)) + geom_point() plot + labs(title = "A nice title") plot + labs(caption = "A sample caption") plot + theme(legend.position = "none") plot + theme(legend.position = "top") ``` ```{r fig-sub-2, fig.cap=''Four Plots Aligned'', fig.subcap=c(''Plot One'', ''Plot Two'', ''Plot Three'', ''Plot Four''), out.width=''.49//linewidth'', fig.asp=1, fig.ncol = 2} x1 <- plot + labs(title = "A nice title") x2 <- plot + labs(caption = "A sample caption") x3 <- plot + theme(legend.position = "none") x4 <- plot + theme(legend.position = "top") plot_grid_split(x1, x2, x3, x4) ```

  • Puede aprender más acerca de las subfiguras en R dentro de esta publicación .
  • Además, puede consultar las opciones de knitr para leer más sobre las opciones de trozos para las subfiguras: https://yihui.name/knitr/options/

Yo usaría facetado para este problema:

library(reshape2) dat <- melt(M,"L") # When in doubt, melt! ggplot(dat, aes(L,value)) + geom_point() + stat_smooth(method="lm") + facet_wrap(~variable,ncol=2,scales="free")

Nota: El lego puede pasar por alto que las escalas son diferentes entre las facetas.


Editar

Las soluciones más simples son: 1) usar el paquete cowplot (vea la respuesta aquí); o 2) use el paquete de egg disponible en github.

# devtools::install_github("baptiste/egg") library(egg) library(grid) g = ggarrange(x1, x2, x3, x4, ncol = 2) grid.newpage() grid.draw(g)

Original

Edición menor: Actualización de código.

Si desea mantener las etiquetas de los ejes, entonces con un poco de violín y código de préstamo de here , esto hace el trabajo.

library(ggplot2) library(gtable) library(grid) library(gridExtra) # Get the widths gA <- ggplotGrob(x1) gB <- ggplotGrob(x2) gC <- ggplotGrob(x3) gD <- ggplotGrob(x4) maxWidth = unit.pmax(gA$widths[2:3], gB$widths[2:3], gC$widths[2:3], gD$widths[2:3]) # Set the widths gA$widths[2:3] <- maxWidth gB$widths[2:3] <- maxWidth gC$widths[2:3] <- maxWidth gD$widths[2:3] <- maxWidth # Arrange the four charts grid.arrange(gA, gB, gC, gD, nrow=2)

SOLUCIONES ALTERNATIVAS: Hay funciones rbind y cbind en el paquete gtable para combinar grobs en un grob. Para los cuadros aquí, los anchos deben establecerse usando size = "max" , pero la versión CRAN de gtable arroja un error.

Una opción es examinar la gráfica grid.arrange , luego usar size = "first" o size = "last" `options:

# Get the ggplot grobs gA <- ggplotGrob(x1) gB <- ggplotGrob(x2) gC <- ggplotGrob(x3) gD <- ggplotGrob(x4) # Arrange the four charts grid.arrange(gA, gB, gC, gD, nrow=2) # Combine the plots g = cbind(rbind(gA, gC, size = "last"), rbind(gB, gD, size = "last"), size = "first") # draw it grid.newpage() grid.draw(g)

Una segunda opción es bind funciones del paquete gridExtra .

# Get the ggplot grobs gA <- ggplotGrob(x1) gB <- ggplotGrob(x2) gC <- ggplotGrob(x3) gD <- ggplotGrob(x4) # Combine the plots g = cbind.gtable(rbind.gtable(gA, gC, size = "max"), rbind.gtable(gB, gD, size = "max"), size = "max") # Draw it grid.newpage() grid.draw(g)


Patchwork es un nuevo paquete que hace que sea realmente fácil formatear y diseñar múltiples ggplots. Una de las mejores cosas de esto es que alinea las áreas de trazado automáticamente. Además, la sintaxis es muy fácil.

devtools::install_github("thomasp85/patchwork") library(patchwork) x1 + x2 + x3 + x4 + plot_layout(ncol = 2)

Echa un vistazo a la página de GitHub para ver más ejemplos: https://github.com/thomasp85/patchwork