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

Mai*_*ura 78 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.
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Jos*_*ien 114

这个怎么样:

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

在此输入图像描述

  • @Anto这个代码似乎有几处错误,但是,显示错误的原因可能与以下所示的错误相同:`x &lt;-list(1,2);。x [[3:1]]`。更广泛地说,使用`plist [...]`之类的东西而不是`plist [[...]]`之类的子集。然后使用`do.call()`,我们必须使用它,因为未将`grid.arrange()`设置为将列表作为其第一个参数。干杯,祝你好运! (2认同)

Mic*_*gge 24

只要使用每个函数中的参数指定列表,就可以使用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
Run Code Online (Sandbox Code Playgroud)


Uwe*_*Uwe 13

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

cowplot::plot_grid(plotlist = plist, ncol = 2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Mic*_*per 7

我知道这个问题是使用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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

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
Run Code Online (Sandbox Code Playgroud)

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