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 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?
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!x <- list(1,2); x[[3:1]]
. En términos más generales, use algo como enplist[...]
lugar deplist[[...]]
hacer su subconjunto. Y luego usedo.call()
, que tenemos que usar porquegrid.arrange()
no está configurado para tomar una lista como su primer argumento. Saludos y mucha suerte!Puede usar
grid.arrange()
yarrangeGrob()
con listas siempre que especifique la lista usando elgrobs =
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
fuente
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
cowplot
paquete:cowplot::plot_grid(plotlist = plist, ncol = 2)
fuente
Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable"
ggplot2
paquete o los gráficos base?ggplot2
.grid.arrange
casi 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 vacaSé que la pregunta establece específicamente el uso del paquete gridExtra , pero la
wrap_plots
funció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)
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
fuente
devtools::install_github("thomasp85/patchwork")
?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.
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.
fuente