将多个ggplot2图组合到PDF

时间:2017-01-26 15:41:46

标签: r

我希望能够将ggplot2中的许多绘图绘制成单个PDF。我在下面制作了可重现的代码,它会创建我收到的错误消息。

m <- matrix(data=cbind(rnorm(30, 0), rnorm(30, 2), rnorm(30, 5)), nrow=30, ncol=3)
df <- as.data.frame(m)
dfs <- stack(df)
uniqueplot1=ggplot(dfs, aes(x=values)) + geom_density()
uniqueplot2=ggplot(dfs, aes(x=values)) + geom_density()

objects=ls()
plot_search=grep("uniqueplot",objects)
objects=objects[plot_search]

pdf("plots.pdf")
grid.arrange(objects,ncol=2)
dev.off()

我收到的错误是:

Error in gList(list("uniqueplot1", "uniqueplot2", wrapvp = list(x = 0.5,  :
  only 'grobs' allowed in "gList"
In addition: Warning message:
In grob$wrapvp <- vp : Coercing LHS to a list

有没有办法将项objects转换为正确的对象类型,以便它可以与grid.arrange一起成功使用?

编辑:这是一个简化的例子 - 在现实生活中,我将生成数百个图,并且不可能单独列出所有这些图。

2 个答案:

答案 0 :(得分:1)

使用lapply(objects, get)为您创建一个包含ggplot对象的列表(因为objects包含两个字符"uniqueplot1" "uniqueplot2"但不包含基础对象的向量),例如在以下示例中:

m   <- matrix(data = cbind(rnorm(30, 0), rnorm(30, 2), rnorm(30, 5)), nrow  =30, ncol = 3)
df  <- as.data.frame(m)
dfs <- stack(df)

uniqueplot1 <- ggplot(dfs, aes(x = values)) + geom_density()
uniqueplot2 <- ggplot(dfs, aes(x = values)) + geom_density()
objects     <- ls()
plot_search <- grep("uniqueplot",objects)
objects     <- objects[plot_search]

pdf("plots.pdf")
gridExtra::grid.arrange(grobs = lapply(objects, get), ncol = 2)
dev.off()

答案 1 :(得分:0)

嗯,R惯用法是将你的循环结果存储在列表中而不是直接存储在环境中,然后从列表中选择所需的元素。然后,您可以使用grid.arrange的grobs参数。像这样的东西,你必须适应你的榜样。

myplots <- lapply(variables, function(v) 
                ggplot(ggplot(dfs, aes_string(x=v)) + geom_density()
names(myplots) <- variables
plotme <- myplots[grep("pickme", variables)]
grid.arrange(grobs=plotme, ncol=2)