我希望能够将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一起成功使用?
编辑:这是一个简化的例子 - 在现实生活中,我将生成数百个图,并且不可能单独列出所有这些图。
答案 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)