【问题标题】:Iterating with ggsave and ggplot2使用 ggsave 和 ggplot2 进行迭代
【发布时间】:2016-08-27 12:47:25
【问题描述】:

我有一个包含 csv 文件的文件夹。我正在遍历这些 csv 文件并为每个 csv 文件创建一个图。我可以通过:

setwd("/myfiles/folder")
filenames = dir(pattern="*.csv")
for (i in 1:length(filenames)) { 
  tmp <-read.csv(filenames[i]); 
  print(ggplot(aes(x = count, y = time), data = tmp) + geom_point(aes(color = id)) 
      + geom_smooth(aes(color = id), method= "lm", se = F, formula=y ~ poly(x, 3, raw=TRUE)) 
      + ggtitle("Title") + labs(x="Count)",y="Time")+ggsave(file="ID_.jpeg"))
}

但是,正如您所期望的那样,这只会创建一个 .jpeg 文件,因此每次都会被覆盖,我只剩下最后保存的绘图了。

我试过了:

for (i in 1:length(filenames)) { 
  tmp <-read.csv(filenames[i]); 
  print(ggplot(aes(x = count, y = time), data = tmp) + geom_point(aes(color = id)) 
       + geom_smooth(aes(color = id), method= "lm", se = F, formula=y ~ poly(x, 3, raw=TRUE)) 
       + ggtitle("Title") + labs(x="Count)",y="Time")+ggsave(file="ID"+id+".jpeg"))
}

但这会导致:

regexpr("\.([[:alnum:]]+)$", x) 中的错误:找不到对象 'id'

为什么 id 以前是不被 ggsave 识别(对于 geom_plot 项目)?

【问题讨论】:

  • R 中的 + 未完成字符串连接,请使用 paste()。例如:ggsave(file=paste0("ID", ID, ".jpeg"))。另外,“ID”从何而来?你的意思是小写的id?您只需为文件名选择一个值。
  • 抱歉,我已经编辑了我的问题 - 我的意思是 id 而不是 IDid 来自 csv 文件,它是一个列标题。它仍然在说object 'id' not found。数据源temp在开头指定为ggplot
  • 好吧,ggsave 不会从图中读取数据。如果你想从 tmp 获取一个值,你需要明确,即tmp$id。但请记住,tmp 的每一行都有自己的 Id 值,如果您愿意,可以使用第一行 tmp$id[1]
  • 这里的部分问题可能是风格上的;可以通过简单地添加到绘图对象的末尾来包含ggsave(),但老实说,我以前从未见过这样做(而且我已经看到了 lots 的 ggplot2 代码)。通常,人们会创建一个绘图对象并将其传递给ggsave 在单独的行中。
  • @joran 我认为“添加” ggsave 非常具有误导性;它等同于在qplot() + NULL 后面跟着ggsave(filename),即它似乎工作是因为有两个附带的副作用:i)ggsave() 没有返回值,也没有类,所以ggplot2:::add_ggplot 很高兴什么都不做; ii) ggsave() 保存显示的最新绘图,如果没有明确传递,这在此处有效(交互式会话),但不应与 qplot() %&gt;% ggsave(file="test.pdf") 混淆。

标签: r csv ggplot2


【解决方案1】:

试试这个,

for (ii in seq_along(filenames)) { 

  tmp <- read.csv(filenames[ii])

  p <- ggplot(aes(x = count, y = time), data = tmp) + 
          geom_point(aes(color = id)) + 
          geom_smooth(aes(color = id), method= "lm", se = F, 
                     formula=y ~ poly(x, 3, raw=TRUE)) + 
          ggtitle("Title") + 
          labs(x="Count)",y="Time")

  ggsave(file=paste0("ID", ii, ".png"), p)
}

【讨论】:

    【解决方案2】:

    因为在 ggplot 中您提供了具有列 ID 的数据(在您的情况下是 tmp)。在 ggsave 中它不要求提供数据,因此当您提供列名 ID 时,ggsave 不知道如何处理它。

    我建议在 ggsave 中使用 i(你的 for 迭代器)。

    for (i in 1:length(filenames)) { 
    tmp <-read.csv(filenames[i]); 
    print(ggplot(aes(x = count, y = time), data = tmp) +   geom_point(aes(color = id)) 
       + geom_smooth(aes(color = id), method= "lm", se = F, formula=y ~ p  oly(x, 3, raw=TRUE)) 
       + ggtitle("Title") + labs(x="Count)",y="Time")+ggsave(file=paste0("ID",i,".jpeg"))
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多