自动突出显示时间序列图中具有高于特定阈值的值的部分?

时间:2019-06-28 17:41:23

标签: r ggplot2 plot time-series highlight

我正在寻找一种突出显示图中某些部分的自动方法,这些部分的Consumer值大于预定义的阈值(在这种情况下为0)。在检查绘图后,可以通过在数据框(Station2)中指定Date来手动完成此操作。

预先感谢您的任何建议!

dateRanges

reprex package(v0.3.0)于2019-06-28创建

2 个答案:

答案 0 :(得分:1)

这是一种使用dplyr元数据包中的tidyrtidyverse在Station2 Flow的每个正范围内创建一个rect的方法:

首先我隔离Station2的“流”行,然后过滤正值之前或之后的零,然后收集并扩展以为每个连续部分创建起点和终点:

library(tidyverse)
dateRanges <- df %>%
  filter(key == "Station2", grp == "Flow (cfs)") %>%
  mutate(from = value == 0 & lead(value, default = -1) > 0,
         to   = value == 0 &  lag(value, default = -1) > 0,
         highlight_num = cumsum(from)) %>% 
  gather(type, val, from:to) %>%
  filter(val) %>%
  select(type, Date, highlight_num) %>%
  spread(type, Date)

> dateRanges
# A tibble: 2 x 3
  highlight_num from       to        
          <int> <date>     <date>    
1             1 2012-02-10 2012-02-23
2             2 2012-01-19 2012-02-04

请注意,我的范围规格在这里有些不同,因为看起来您的范围从第一个正值开始,但在一个正值范围后继续到零。对于我的代码,您需要绘制:

...
geom_rect(data = dateRanges, 
            aes(xmin = from, xmax = to, ymin = -Inf, ymax = Inf),
...

编辑#2:

原始海报提供了更大的数据样本,暴露了我没有考虑过的两个极端情况。 1)value中的NA;易于过滤。 2)单日为零的场合,因此既是范围的开始和结束。解决此问题的一种方法是将开始和结束定义为第一个和最后一个正值。下面的代码似乎适用于较大的数据。

dateRanges <- df %>%
  filter(!is.na(value)) %>%
  filter(key == "Station2", grp == "Flow (cfs)") %>%
  mutate(positive = value > 0,
         border   = positive != lag(positive, default = TRUE),
         from     = border & positive,
         to       = border & !positive,
         highlight_num = cumsum(from)) %>%
  gather(type, val, from:to) %>% 
  filter(val) %>% 
  select(type, Date, highlight_num) %>%
  spread(type, Date) %>%
  filter(!is.na(from), !is.na(to))

enter image description here

答案 1 :(得分:1)

类似的东西:

library(dplyr)
dateRanges <- df %>% 
  mutate(Date2 = lead(Date)) %>% 
  filter(key == 'Station2', value > 0 | lead(value) > 0, Date2 - Date == 1)

gg1 +
  geom_rect(data = dateRanges, 
            aes(xmin = Date, xmax = Date2, ymin = -Inf, ymax = Inf), 
            inherit.aes = FALSE,
            color = NA,
            fill = 'grey20',
            alpha = 0.2)

每天只画一个rect是最简单的。