¿Cómo organizo una lista variable de parcelas usando grid.arrange?
Frecuentes
Visto 56,880 veces
106
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?
5 Respuestas
161
Qué tal esto:
library(gridExtra)
n <- length(plist)
nCol <- floor(sqrt(n))
do.call("grid.arrange", c(plist, ncol=nCol))
contestado el 22 de mayo de 12 a las 18:05
43
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.
20
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)
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
11
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)
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
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 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 r ggplot2 or haz tu propia pregunta.
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 comoplist[...]
más bien queplist[[...]]
para hacer su subconjunto. y luego usardo.call()
, que tenemos que usar porquegrid.arrange()
no está configurado para tomar una lista como su primer argumento. Saludos, y mucha suerte! - Josh O'Brien