如何使用grid.arrange排列变量列表?

时间:2012-05-22 17:08:08

标签: r ggplot2

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.

我想在grid.arrange()中使用gridExtra排列图表。

如果plist中的绘图数量可变,我该怎么做?

这有效: grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

但我需要一个更通用的解决方案。想法?

5 个答案:

答案 0 :(得分:99)

这个怎么样:

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

enter image description here

答案 1 :(得分:18)

只要您在每个函数中使用grid.arrange()参数指定列表,就可以将arrangeGrob()grobs =与列表一起使用。例如。在你给出的例子中:

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

答案 2 :(得分:11)

为了完整起见(以及这个旧的,已经回答的问题has been revived, recently),我想使用cowplot包添加解决方案:

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

enter image description here

答案 3 :(得分:5)

我知道这个问题具体是使用 gridExtra 软件包提出的,但是 patchwork 软件包中的wrap_plots函数是处理可变长度列表的一种好方法:

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

关于它的一个有用的事情是,您无需指定所需的列数,并且旨在使列数和行数保持相等。例如:

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
  

了解有关 Patchwork 软件包here

的更多信息

答案 4 :(得分:1)

要适合一页上的所有图,您可以像这样计算列数和行数:

x = length(plots)

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

由于大多数绘图功能都将ncol和nrow作为参数,因此您可以将它们放在其中。我喜欢ggpubr的ggarrange。

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

这有利于行多于列,因此如果需要相反的话则相反。即对于6个地块,它将给出3行2列,而不是相反。