【问题标题】:Trouble Plotting Several Large Timeseries in R with ggplot使用 ggplot 在 R 中绘制多个大型时间序列时出现问题
【发布时间】:2016-05-21 16:34:24
【问题描述】:

我有一个包含 16 个独立时间序列的大型数据集。我想将它们绘制在 3x7 网格中,顶行是以 IN 结尾的每个时间序列,底行是以 OUT 结尾的每个时间序列。在中间行,我将重复两个以 RN 结尾的时间序列中的每一个,它们对应于每个 IN/OUT 对。我已经设置了我认为完成的必要逻辑和语法,但我继续与数据类作斗争,并且无法让脚本运行足够长的时间来调试其余部分。我是 R 的新手,所以我不确定如何继续。

library(ggplot2)

numbers <- read.csv("./AllData.csv", header=TRUE) 
num <- (ncol(numbers) - 4)/4*3 #converts 36 columns to 24 plots involving 8 timeseries

par(mfrow=c(3,7))
for(i in 1:num){
  if (i < 8) {
    qplot(as.POSIXct(as.Date(numbers[4*i+1])), numbers[4*i+2], data="numbers", xlab="Date", ylab="Feet", main=numbers[4*i+2,1])
  } else if (i < 15) {
    qplot(as.POSIXct(as.character(numbers[4*i-6]), format="%m/%d/%Y %H:%M"), numbers[4*i-5], data="numbers", xlab="Date", ylab="Feet", main=numbers[4*i-5,1])
  } else {
    qplot(as.POSIXct(as.character(numbers[4*i-13]), format="%m/%d/%Y %H:%M"), numbers[4*i-12], data="numbers", xlab="Date", ylab="Feet", main=numbers[4*i-12,1])
  }

代替“as.POSIXct”,我还尝试了“as.Date”,“as.POSIXlt”,并简单地按原样绘制数据集,但都会导致类似的错误,通知我 ggplot 无法使用无论我使用什么课程。我尝试使用下面的基本绘图功能,但随后收到错误,我的 x 和 y 长度不同,我已经检查过并且长度相同。

par(mfrow=c(3,7))
for(i in 1:num){
  if (i < 8) {
    x <- as.POSIXct(as.character(numbers[4*i+1]), format="%m/%d/%Y %H:%M")
    x <- numbers[4*i+1]
    y <- numbers[4*i+2]
    main <- numbers[4*i+2,1]
  } else if (i < 15) {
    x <- as.POSIXct(as.character(numbers[4*i-6]), format="%m/%d/%Y %H:%M")
    y <- numbers[4*i-5]
    main <- numbers[4*i-5,1]
  } else {
    x <- as.POSIXct(as.character(numbers[4*i-13]), format="%m/%d/%Y %H:%M")
    y <- numbers[4*i-12]
    main <- numbers[4*i-12,1]
  }
  plot(x, y, type="l", xlab="Date", ylab="Feet", heading=main)
}

任何智慧或指导将不胜感激。这是我的数据集:https://drive.google.com/file/d/0BzEFYP8cpjHpUlluSlNZaTN1RDA/view?usp=sharing

【问题讨论】:

    标签: r datetime plot ggplot2 time-series


    【解决方案1】:

    这里有几处我已更改,[(子集)与[[(索引)混淆,ggplot 数据框被指定为字符变量(导致错误消息ggplot 无法处理字符变量),列名(读入names 属性)与第一行等混淆。

    说句公道话,这首先发生在每个人身上。我强烈建议您先阅读 Hadley Wickham 的“Advanced-R”编程书籍(或类似的)的前两章,然后再尝试其他如此雄心勃勃的东西。你会明白我的意思,如果一个人不能很好地理解名称(和其他属性)、子集、数据框和列表(数据框是 R 中的专用列表),那么使用 R 是非常困难的。

    在线版链接在这里:http://adv-r.had.co.nz/

    还可以先尝试为一个小示例工作。这太大了,无法开始。

    无论如何这里是更正的代码:

    library(ggplot2)
    
    numbers <- read.csv("./AllData.csv", header=TRUE) 
    num <- (ncol(numbers) - 4)/4*3 #converts 36 columns to 24 plots involving 8 timeseries
    
    par(mfrow=c(3,7))
    for(i in 1:1){
      if (i < 8) {
        qplot(as.Date(numbers[[4*i+1]],"%m/%d/%Y %H:%M"), numbers[[4*i+2]], xlab="Date", ylab="Feet", main=names(numbers)[4*i+2])
    #    qplot(as.POSIXct(as.character(numbers[4*i+1]), format="%m/%d/%Y %H:%M"), numbers[[4*i+2]],  xlab="Date", ylab="Feet", main=numbers[4*i+2,1])
      } else if (i < 15) {
        qplot(as.Date(numbers[[4*i-6]],"%m/%d/%Y %H:%M"), numbers[[4*i-5]],  xlab="Date", ylab="Feet", main=names(numbers)[4*i-5])
    #    qplot(as.POSIXct(as.character(numbers[4*i-6]), format="%m/%d/%Y %H:%M"), numbers[[4*i-5]],  xlab="Date", ylab="Feet", main=numbers[4*i-5,1])
      } else {
        qplot(as.Date(numbers[[4*i-13]],"%m/%d/%Y %H:%M"), numbers[[4*i-12]], xlab="Date", ylab="Feet", main=names(numbers)[4*i-12])
    #    qplot(as.POSIXct(as.character(numbers[4*i-13]), format="%m/%d/%Y %H:%M"), numbers[[4*i-12]], xlab="Date", ylab="Feet", main=numbers[4*i-12,1])
      }
    }
    

    这是情节(我将其缩减为一个情节,因为它们需要很长时间):

    【讨论】:

    • 非常感谢您的帮助!我已经工作了几个小时,甚至无法判断我是否朝着正确的方向前进。并感谢您提供该书的链接。我相信它会帮助我知道我在这里做什么。
    • 好吧,请把它标记为正确。我这样做是为了积分,以及我喜欢帮助别人。当你达到 15 分时,你也可以考虑在某个时候投票。
    • 很抱歉。我不确定如何标记正确答案。这是我的第一篇文章。而且我已经对你的答案投了赞成票,只是还没有足够的分数让它可见。
    • 您在使用 R-Studio 吗?您可以循环浏览绘图并在绘图窗口中一个接一个地查看它们。否则,您可能需要考虑将它们嵌入到 R-Markdown 文件中并将它们作为 html 或 pdf 输出查看。
    • 另一种选择是使用arrange.grob 排列它们并将它们作为一个打印出来,但是对于这种方法来说,这将是很多情节。
    猜你喜欢
    • 2020-03-30
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 2023-02-19
    • 1970-01-01
    相关资源
    最近更新 更多