如何使用 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
包或基本图形?
ggplot2
。 grid.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 <- list(1,2); x[[3:1]]
。更广泛地说,使用类似plist[...]
而不是plist[[...]]
来进行子集化。然后使用do.call()
,我们必须使用它,因为grid.arrange()
没有设置为将列表作为其第一个参数。干杯,祝你好运!以上是关于如何使用 grid.arrange 排列变量列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何降低gridExtra的grid.arrange中的主标题?
在闪亮的应用程序中使用滑块控制 grid.arrange 中的水平和垂直空间