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.

我想使用grid.arrange()in来安排情节gridExtra

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

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

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

4

5 回答 5

161

这个怎么样:

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

在此处输入图像描述

于 2012-05-22T17:14:04.967 回答
44

只要您使用每个函数中的参数指定列表,您就可以使用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
于 2017-03-15T19:17:28.273 回答
20

为了完整起见(并且这个旧的,已经回答的问题最近已经恢复)我想使用该cowplot包添加一个解决方案:

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

在此处输入图像描述

于 2017-03-16T05:54:30.680 回答
11

我知道这个问题特别说明了使用gridExtra 包,但是patchworkwrap_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)

在此处输入图像描述

一个有用的事情是您不需要指定需要多少列,并且旨在保持列数和行数相等。例如:

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

在此处了解有关拼凑包的更多信息

于 2018-07-15T23:22:28.870 回答
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 列,而不是相反。

于 2018-11-27T07:56:30.690 回答