我希望能够将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.range成功一起使用?
编辑:这是一个简化的例子 - 在现实生活中,我将制作数百个情节,并且不可能单独列出所有这些。
使用 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()
好吧,R 习惯用法是将循环中的结果存储在列表中,而不是直接存储在环境中,然后从列表中选择所需的元素。然后,您可以使用 grid.ararrangement 的 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)