Como faço para organizar uma lista variável de charts 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. 

Eu gostaria de organizar os charts usando grid.arrange() em gridExtra .

Como eu faria isso se o número de plots em plist fosse variável?

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

mas preciso de uma solução mais geral. pensamentos?

Que tal agora:

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

insira a descrição da imagem aqui

Você pode usar grid.arrange() e arrangeGrob() com listas, desde que você especifique a lista usando o grobs = argumento em cada function. Por exemplo, no exemplo que você deu:

 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 

Por uma questão de completude (e como esta antiga pergunta já respondida foi revivida, recentemente ) eu gostaria de adicionar uma solução usando o pacote cowplot :

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

insira a descrição da imagem aqui

Eu sei que a pergunta especificamente afirma usar o pacote gridExtra , mas a function wrap_plots do pacote patchwork é uma ótima maneira de lidar com a lista de tamanho variável:

 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) 

insira a descrição da imagem aqui

Uma coisa útil sobre isso é que você não precisa especificar quantas colunas são necessárias e terá como objective manter os números de colunas e linhas iguais. Por exemplo:

 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