¿Cómo organizo una lista variable de parcelas usando grid.arrange?

92
library(ggplot2)
df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)
# In my real example,a plot function will fit a ggplot to a list of datasets 
#and return a list of ggplots like the example above.

Me gustaría arreglar las parcelas usando grid.arrange()in gridExtra.

¿Cómo haría esto si el número de parcelas plistes variable?

Esto funciona: grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

pero necesito una solución más general. pensamientos?

Maiasaura
fuente

Respuestas:

139

Qué tal esto:

library(gridExtra)
n <- length(plist)
nCol <- floor(sqrt(n))
do.call("grid.arrange", c(plist, ncol=nCol))

ingrese la descripción de la imagen aquí

Josh O'Brien
fuente
Esto es bueno, excepto que la función no puede manejar objetos NULL.
Roman Luštrik
Josh. te quiero. He pasado 2 horas en esto hasta ahora. ¿Le importaría explicar por qué esto no funciona? grid.arrange(plist[[1:length(plist)]], ncol = nCol))Recibo un error como este: Error in hl.plots[[1:12]] : no such index at level 3¡Gracias!
Anto
2
@Anto Parece que hay varias cosas mal con ese código, pero la que le da el error que aparece es probablemente causado por el mismo tipo de error como se muestra a continuación: x <- list(1,2); x[[3:1]]. En términos más generales, use algo como en plist[...]lugar de plist[[...]]hacer su subconjunto. Y luego use do.call(), que tenemos que usar porque grid.arrange()no está configurado para tomar una lista como su primer argumento. Saludos y mucha suerte!
Josh O'Brien
31

Puede usar grid.arrange()y arrangeGrob()con listas siempre que especifique la lista usando el grobs =argumento en cada función. Por ejemplo, en el ejemplo que dio:

library(ggplot2)
library(gridExtra)
df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)

grid.arrange(grobs = plist, ncol = 2) ## display plot
ggsave(file = OutFileName, arrangeGrob(grobs = plist, ncol = 2))  ## save plot
Michael Ohlrogge
fuente
1
Me tomó muchísimo tiempo encontrar esta respuesta ... ¡gracias! Este es el más simple.
Matt L.
16

En aras de la integridad (y como esta vieja pregunta ya respondida ha sido revivida recientemente ), me gustaría agregar una solución usando el cowplotpaquete:

cowplot::plot_grid(plotlist = plist, ncol = 2)

ingrese la descripción de la imagen aquí

Uwe
fuente
cualquier idea de por qué pasar una lista de parcelas usando este código devuelve este error: Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable"
geog_newbie
¿Cómo se generaron las parcelas? ¿Utiliza el ggplot2paquete o los gráficos base?
Uwe
ggplot2. grid.arrangecasi funcionó para mí, pero resulta que mi lista de parcelas no se está completando. Publiqué el problema como una pregunta: stackoverflow.com/questions/43216262/… . Entonces, me pregunto si ese también podría haber sido el problema de la trama de la vaca
geog_newbie
10

Sé que la pregunta establece específicamente el uso del paquete gridExtra , pero la wrap_plotsfunción del paquete patchwork es una excelente manera de manejar la lista de longitud variable:

library(ggplot2)
# devtools::install_github("thomasp85/patchwork")
library(patchwork)

df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)

wrap_plots(plist)

ingrese la descripción de la imagen aquí

Algo útil de esto es que no es necesario especificar cuántas columnas se requieren y el objetivo es mantener el número de columnas y filas iguales. Por ejemplo:

plist <- list(p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1)
wrap_plots(plist) # produces a 4 col x 4 row plot

Obtenga más información sobre el paquete de patchwork aquí

Michael Harper
fuente
Parece que no puedo instalar el paquete que ha mencionado aquí
baxx
¿Ha intentado ejecutar la línea de instalación que se comenta arriba devtools::install_github("thomasp85/patchwork")?
Michael Harper
Gracias, no lo hice. Intenté usar la instalación de RStudio.
baxx
1
El paquete aún no está disponible en CRAN, por lo que debe instalarlo a través de GitHub. ¡Con suerte, este no será el caso por mucho más tiempo, ya que es un paquete excelente!
Michael Harper
1

Para ajustar todos los gráficos en una página, puede calcular el número de columnas y filas de esta manera:

x = length(plots)

cols = round(sqrt(x),0)
rows = ceiling(x/cols)

Como la mayoría de las funciones de trazado múltiple tienen ncol y nrow como argumentos, puede ponerlos allí. Me gusta ggarrange de ggpubr.

ggarrange(plotlist = plots, ncol=cols, nrow = rows)

Esto favorece más filas que columnas, así que invierta si desea lo contrario. Es decir, para 6 parcelas dará 3 filas y 2 columnas y no al revés.

Adam Waring
fuente