【发布时间】:2020-08-22 13:10:38
【问题描述】:
我正在尝试通过 for 循环为我的数据集中的多个列创建数据操作前后的数据比较图。最终,我想将所有比较图保存到一个 pdf 文件中。首先,我之前生成图,操作数据,之后生成图,并希望通过 ggarrange 将它们并排放置(我也尝试了 gridExtra 中的 grid.arrange,但这并不能解决问题)。 然而,我得到的是数据处理后的相同图(尽管标题不同)。
这是一个可重现的例子:
library(rlist)
library(ggplot2)
library(ggpubr)
head(iris)
plot_before <- list()
plot_after <- list()
plots <- list()
for (i in 1:4){
p <- ggplot(iris,aes(iris[,i])) + geom_histogram()+ggtitle(paste0(i,"_pre"))
print(p)
plot_before <- list.append(plot_before,p)
#do something with your data
iris[,i] <- 3*iris[,i]
p2 <- ggplot(iris,aes(iris[,i])) + geom_histogram()+ggtitle(paste0(i,"_post"))
print(p2)
plot_after <- list.append(plot_after, p2)
q <- ggarrange(p,p2) #here, p is already linked to modified data
print(q)
plots <- list.append(plots, q)
}
#try to access plots from lists
for (i in 1:4){
print(plot_before[[i]])
print(plot_after[[i]])
print(plots[[i]])
}
我想这与 ggplot 创建“仅”一个链接到数据的图形对象有关,所以当我再次打印它时,它会再次访问数据并获取操作数据而不是获取以前的“快照” . 将图表保存到单独的列表也无济于事,它们也“链接”到被操纵的数据。
有没有办法制作一个持久的 ggplot 对象而不是将其链接到数据?
当然可以使用修改后的数据创建新列并引用这些列或创建一个全新的数据框,但我想避免数据重复。
【问题讨论】:
-
您是否尝试在 for 循环的末尾添加 dev.off()?
-
是的,我尝试使用 dev.off(),也在每次 print() 之后。它没有帮助。
标签: r object ggplot2 persistent