【问题标题】:Loop and save ggplot循环并保存ggplot
【发布时间】:2017-08-22 15:27:21
【问题描述】:

我有以下生成图表的代码。我想循环这段代码并为 y = (当前为 XYZ)输入不同的值。对于每个 ggplot 图,我想保存输出。例如,第一个循环是 y = XYZ,第二个循环是 y = ABC,第三个循环是 y = QRS 等。

UK<-ggplot(Diff, aes(x = FactSet.Fund.Code  , y = XYZ, colour = Fund.Manager.x))
UK<- UK + geom_point(data = subset(Diff,DeskName.x=="UK Equities"), size = 6)
UK<- UK + theme(axis.text = element_text(angle = 90))

【问题讨论】:

  • 也许你需要 aes_string 而不是 aes,因为你在循环。保存绘图取决于您是想要单独的 png 文件还是一个包含多个页面的 pdf 文件。

标签: r loops ggplot2


【解决方案1】:

通常ggplots保存在一个列表中,试试下面:

Y_list = c('XYZ', 'ABC', 'QRS')
g_list = list()
for (yi in Y_list) {
    UK<-ggplot(Diff, aes_string(x = 'FactSet.Fund.Code', y = yi, colour = 'Fund.Manager.x'))
    UK<- UK + geom_point(data = subset(Diff,DeskName.x=="UK Equities"), size = 6)
    UK<- UK + theme(axis.text = element_text(angle = 90))
    g_list[[yi]] = UK
}

【讨论】:

  • 谢谢,第一个解决方案看起来不错,虽然我不想保存情节(我的误解!)我只想将它分配给一个对象。所以就在 ggsave 之前,第一个循环将带有绘图的对象命名为 UKXYZ,如果你知道我,第二个循环将命名为 UKABC?
  • @user8491385 我误会你了,请尝试更新答案。
【解决方案2】:

这应该可以。肖恩关于aes_string 让它发挥作用是完全正确的。 aes 通常使用非标准评估(如果您不熟悉,我建议阅读 here)。出于您的目的,这意味着您不能只将下面循环中的i 直接传递给aes,因为aes 会将其解释为列,而不是评估i 包含的信息。 aes_string 只允许您将列的名称作为字符串传递。然后你可以在你的循环中单独保存每个情节。

library(ggplot2)


code_list <- list("ABC","XYZ")

Diff <- data.frame(FactSet.Fund.Code = as.character(1:10), 
                   XYZ = rnorm(1:10), ABC = rnorm(1:10))

for(i in code_list){
   ggplot(Diff, aes_string(x = "FactSet.Fund.Code", y = i)) +
              geom_point(size = 6)
  ggsave(paste0(i,".png"))
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 2015-10-16
    • 2015-02-09
    • 2022-01-11
    • 2020-02-27
    • 2019-04-22
    相关资源
    最近更新 更多