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

Eu gostaria de organizar as parcelas usando grid.arrange()em gridExtra.

Como eu faria isso se o número de parcelas plistfosse 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?

Maiasaura
fonte

Respostas:

139

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

Josh O'Brien
fonte
Isso é bom, exceto que a função não pode lidar com objetos NULL.
Roman Luštrik
Josh. Eu te amo. Passei 2 horas nisso até agora. Você poderia explicar por que isso não funciona: grid.arrange(plist[[1:length(plist)]], ncol = nCol))Recebo um erro como este: Error in hl.plots[[1:12]] : no such index at level 3Obrigado!
Anto
2
@Anto Parece haver várias coisas de errado com esse código, mas o que lhe dá o erro exibido provavelmente é causado pelo mesmo tipo de erro, como é mostrado aqui: x <- list(1,2); x[[3:1]]. De forma mais ampla, use algo como em plist[...]vez de plist[[...]]fazer seus subconjuntos. E então use do.call(), que temos que usar porque grid.arrange()não está configurado para receber uma lista como seu primeiro argumento. Saudações e boa sorte!
Josh O'Brien
31

Você pode usar grid.arrange()e arrangeGrob()com listas, desde que especifique a lista usando o grobs =argumento em cada função. 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
Michael Ohlrogge
fonte
1
Levei muito tempo para encontrar essa resposta ... obrigado! Este é o mais simples.
Matt L.
16

Para ser mais completo (e como esta velha questão já respondida foi reavivada, recentemente ), gostaria de adicionar uma solução usando o cowplotpacote:

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

insira a descrição da imagem aqui

Uwe
fonte
alguma ideia de por que passar uma lista de plotagens usando este código retorna este erro: Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable"
geog_newbie
Como os gráficos foram gerados? Usando o ggplot2pacote ou gráficos básicos?
Uwe
ggplot2. grid.arrangequase funcionou para mim - mas, acontece que minha lista de parcelas não está sendo preenchida. Publiquei o problema como uma pergunta: stackoverflow.com/questions/43216262/… . Então, eu estou me perguntando se esse poderia ter sido o problema para o cowplot também
geog_newbie
10

Eu sei que a questão afirma especificamente usando o pacote gridExtra , mas a wrap_plotsfunção do pacote patchwork é uma ótima maneira de lidar com listas de comprimento 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 objetivo manter o número 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

Descubra mais sobre o pacote patchwork aqui

Michael Harper
fonte
Não consigo instalar o pacote que você mencionou aqui
baxx
Você já tentou executar a linha de instalação comentada acima devtools::install_github("thomasp85/patchwork")?
Michael Harper
Obrigado, eu não fiz. Acabei de tentar usar a instalação do RStudio.
baxx
1
O pacote ainda não está disponível no CRAN, então você deve instalá-lo através do GitHub. Esperançosamente este não será o caso por muito mais tempo, pois é um pacote excelente!
Michael Harper
1

Para ajustar todos os gráficos em uma página, você pode calcular o número de colunas e linhas como este:

x = length(plots)

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

Como a maioria das funções de plotagem múltiplas tem ncol e nrow como argumentos, você pode simplesmente colocá-los lá. Eu gosto do ggarrange do ggpubr.

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

Isso favorece mais linhas do que colunas, portanto, inverta se quiser o oposto. Ou seja, para 6 plotagens, obterá 3 linhas e 2 colunas e não o contrário.

Adam Waring
fonte