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

Posted

技术标签:

【中文标题】如何使用 grid.arrange 排列变量列表?【英文标题】:How do I arrange a variable list of plots using grid.arrange? 【发布时间】:2012-05-29 05:20:48 【问题描述】:
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.

我想在gridExtra 中使用grid.arrange() 安排绘图。

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

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

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

【问题讨论】:

【参考方案1】:

要将所有图都放在一页上,您可以计算列数和行数,如下所示:

x = length(plots)

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

由于大多数多重绘图函数都有 ncol 和 nrow 作为参数,你可以把它们放在那里。我喜欢来自 ggpubr 的 ggarrange。

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

这有利于更多的行而不是列,如果你想要相反的话,可以反过来。 IE。对于 6 个图,它将给出 3 行和 2 列,而不是相反。

【讨论】:

【参考方案2】:

我知道这个问题具体说明了使用 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

了解更多关于 patchwork 包here

【讨论】:

我似乎无法安装您在此处提到的软件包 你试过运行上面devtools::install_github("thomasp85/patchwork")上面注释掉的安装行吗? 谢谢,我没有。我只是尝试使用 RStudio 的安装。 CRAN 上还没有这个包,所以你必须通过 GitHub 安装它。希望这种情况不会持续太久,因为它是一个很好的包!【参考方案3】:

为了完整起见(并且作为这个老问题,已经回答了has been revived, recently),我想使用cowplot 包添加一个解决方案:

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

【讨论】:

知道为什么使用此代码传递绘图列表会返回此错误:Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable" 绘图是如何生成的?使用ggplot2 包或基本图形? ggplot2grid.arrange 几乎为我工作 - 但是,结果我的情节列表没有被填充。我将问题发布为问题:***.com/questions/43216262/…。所以,我想知道这是否也是 cowplot 的问题【参考方案4】:

您可以将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

【讨论】:

我花了很长时间才找到这个答案......谢谢!这是最简单的。【参考方案5】:

这个怎么样:

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

【讨论】:

这很好,只是函数不能处理 NULL 对象。 乔希。我爱你。到现在为止已经花了2个小时。您是否愿意解释一下为什么这不起作用:grid.arrange(plist[[1:length(plist)]], ncol = nCol)) 我收到这样的错误:Error in hl.plots[[1:12]] : no such index at level 3 谢谢! @Anto 该代码似乎有几处错误,但显示的错误可能是由与此处显示的相同类型的错误引起的:x &lt;- list(1,2); x[[3:1]]。更广泛地说,使用类似plist[...] 而不是plist[[...]] 来进行子集化。然后使用do.call(),我们必须使用它,因为grid.arrange() 没有设置为将列表作为其第一个参数。干杯,祝你好运!

以上是关于如何使用 grid.arrange 排列变量列表?的主要内容,如果未能解决你的问题,请参考以下文章

将 grid.arrange() 绘图保存到文件

如何降低gridExtra的grid.arrange中的主标题?

grid.arrange在菜单后面没有完成绘制大图

在闪亮的应用程序中使用滑块控制 grid.arrange 中的水平和垂直空间

R语言可视化包ggplot2包绘制多个图形并将多个图像垂直堆叠c成一个图像实战(grid.arrange)

左对齐两个图形边缘(ggplot)