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

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 organizar las parcelas usando grid.arrange() in gridExtra.

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

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

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

preguntado el 22 de mayo de 12 a las 18:05

5 Respuestas

Qué tal esto:

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

enter image description here

contestado el 22 de mayo de 12 a las 18:05

Esto es bueno, excepto que la función no puede manejar objetos NULL. - Luštrik romano

jose Te amo. He pasado 2 horas en esto hasta ahora. ¿Te 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

@Anto Parece que hay varias cosas mal con ese código, pero el que le da el error que se muestra probablemente sea causado por el mismo tipo de error que se muestra aquí: x <- list(1,2); x[[3:1]]. En términos más generales, use algo como plist[...] más bien que plist[[...]] para hacer su subconjunto. y luego usar 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

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

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

respondido 15 mar '17, 19:03

Me tomó demasiado tiempo encontrar esta respuesta... ¡gracias! Este es el más simple. - Matt L.

En aras de la exhaustividad (y como esta vieja pregunta ya respondida ha sido revivido, recientemente) Me gustaría agregar una solución usando el cowplot paquete:

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

enter image description here

contestado el 23 de mayo de 17 a las 13:05

alguna 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_novato

¿Cómo se generaron las tramas? Utilizando el ggplot2 ¿Paquete o gráficos base? - Uwe

ggplot2. grid.arrange casi funcionó para mí, pero resulta que mi lista de parcelas no se completa. Publiqué el problema como una pregunta: stackoverflow.com/questions/43216262/… . Entonces, me pregunto si ese podría haber sido el problema para cowplot también: geog_novato

Sé que la pregunta establece específicamente el uso de la cuadrículaExtra paquete, pero el wrap_plots funcionar desde el Patchwork El paquete 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)

enter image description here

Una cosa útil al respecto es que no necesita especificar cuántas columnas se requieren, y su objetivo será mantener el mismo número de columnas y filas. 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 la Patchwork paquete aquí

respondido 04 nov., 18:18

Parece que no puedo instalar el paquete que has mencionado aquí. baxx

¿Ha intentado ejecutar la línea de instalación que se comenta arriba? devtools::install_github("thomasp85/patchwork")? - miguel harper

Gracias, no lo hice. Acabo de intentar usar la instalación de RStudio. - baxx

El paquete aún no está disponible en CRAN, por lo que debe instalarlo a través de GitHub. ¡Esperemos que este no sea el caso por mucho más tiempo, ya que es un paquete excelente! - miguel harper

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 invierte si quieres lo contrario. Es decir, para 6 parcelas dará 3 filas y 2 columnas y no al revés.

respondido 27 nov., 18:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.