【问题标题】:ggplot2 time series plotting: how to omit periods when there is no data points?ggplot2时间序列绘图:如何省略没有数据点的时段?
【发布时间】:2014-01-24 22:42:22
【问题描述】:

我有一个包含多天数据的时间序列。在每一天之间有一个没有数据点的时段。使用ggplot2 绘制时间序列时如何省略这些时间段?

如下图人工示例,如何去掉两个没有数据的时间段?

代码:

Time = Sys.time()+(seq(1,100)*60+c(rep(1,100)*3600*24, rep(2, 100)*3600*24, rep(3, 100)*3600*24))
Value = rnorm(length(Time))
g <- ggplot() 
g <- g + geom_line (aes(x=Time, y=Value))
g

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    首先,创建一个分组变量。这里,如果时间差大于 1 分钟,则两组是不同的:

    Group <- c(0, cumsum(diff(Time) > 1))
    

    现在可以使用facet_grid 和参数scales = "free_x" 创建三个不同的面板:

    library(ggplot2)
    g <- ggplot(data.frame(Time, Value, Group)) + 
      geom_line (aes(x=Time, y=Value)) +
      facet_grid(~ Group, scales = "free_x")
    

    【讨论】:

    • 当你只有几个块时绝对是最好的解决方案。
    • 谢谢。我试图在一个情节中做到这一点,但您的方法似乎仍然可以接受。像 quantmod 这样的其他软件包可以完全正确地做到这一点,但我想这不是 ggplot2 应该做的。
    【解决方案2】:

    问题是 ggplot2 怎么知道你有缺失值?我看到两个选项:

    1. NA 值填充您的时间序列
    2. 添加一个表示“组”的附加变量。例如,

      dd = data.frame(Time, Value)
      ##type contains three distinct values
      dd$type = factor(cumsum(c(0, as.numeric(diff(dd$Time) - 1))))
      
      ##Plot, but use the group aesthetic
      ggplot(dd, aes(x=Time, y=Value)) +
            geom_line (aes(group=type))
      

      给予

    【讨论】:

    • 谢谢。但我宁愿完全摆脱两者之间的空白句点(意味着甚至没有显示在 x 轴上)。
    • 你没有在你的问题中提出这个问题;)但是你接受的答案对于几个街区来说要好得多,这就是我想要的。
    【解决方案3】:

    csgillespie 提到了通过 NA 进行填充,但更简单的方法是在每个块之后添加一个 NA:

    Value[seq(1,length(Value)-1,by=100)]=NA
    

    -1 避免警告的地方。

    【讨论】:

      猜你喜欢
      • 2017-03-04
      • 2021-05-12
      • 1970-01-01
      • 2016-04-07
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      相关资源
      最近更新 更多