如何使用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.

我想使用grid.arrange()中来安排地块gridExtra

如果地块数量多,我该怎么办 plist可变,?

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

但是我需要一个更通用的解决方案。有什么想法吗?

Answers:


139

这个怎么样:

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

在此处输入图片说明


很好,除了函数不能处理NULL对象。
RomanLuštrik'12

乔希 我爱你。到现在为止已经花了2个小时。您是否愿意解释为什么这行不通:grid.arrange(plist[[1:length(plist)]], ncol = nCol))我收到这样的错误:Error in hl.plots[[1:12]] : no such index at level 3谢谢!
Anto

2
@Anto该代码似乎有几处错误,但是,显示错误的原因可能与此处显示的错误相同x <- list(1,2); x[[3:1]]。更广泛地说,使用类似方法plist[...]而不是plist[[...]]进行子设置。然后使用do.call(),我们必须使用,因为grid.arrange()它没有设置为将列表作为第一个参数。干杯,祝你好运!
Josh O'Brien 2015年

31

只要在每个函数中使用参数指定列表,就可以使用grid.arrange()arrangeGrob()with列表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

1
花了我很长时间才找到这个答案...谢谢!这是最简单的。
马特L.18年

16

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

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

在此处输入图片说明


任何想法为何使用此代码传递绘图列表都会返回此错误: Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable"
geog_newbie

地块是如何产生的?使用ggplot2包装或基本图形?
Uwe

ggplot2grid.arrange几乎对我有用-但是,事实证明,我的地块清单没有增加。我将问题发布为一个问题: stackoverflow.com/questions/43216262/… 。因此,我想知道是否也可能是考图的问题
geog_newbie

10

我知道这个问题是使用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)

在此处输入图片说明

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

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

在此处了解有关拼凑而成的软件包的更多信息


我似乎无法安装您在这里提到的软件包
baxx

您是否尝试过运行上面已注释掉的安装线devtools::install_github("thomasp85/patchwork")
迈克尔·哈珀

谢谢,我没有。我只是尝试使用RStudio进行安装。
baxx

1
该软件包在CRAN上尚不可用,因此您必须通过GitHub进行安装。希望这种情况不会再持续多久了,因为它是一个很好的程序包!
迈克尔·哈珀

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列,而不是相反。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.