R 自动突出显示值高于某个阈值的时间序列图部分的方法?

R 自动突出显示值高于某个阈值的时间序列图部分的方法?,r,ggplot2,plot,time-series,highlight,R,Ggplot2,Plot,Time Series,Highlight,我正在寻找一种自动方式来突出显示图中某些部分,这些部分的Station2值大于预定义的阈值(在本例中为0)。检查绘图后,我可以通过在数据框dateRanges中指定日期来手动执行此操作 提前感谢您的建议 图书馆GGPLOT2 样本数据 df A TIBLE:6 x 4 >日期键值 > >1 2012-01-16车站1 5278。流量cfs >2012年1月17日第5255站。流量cfs >3 2012-01-18车站15207。流量cfs >4 2012-0

我正在寻找一种自动方式来突出显示图中某些部分,这些部分的Station2值大于预定义的阈值(在本例中为0)。检查绘图后,我可以通过在数据框dateRanges中指定日期来手动执行此操作

提前感谢您的建议

图书馆GGPLOT2 样本数据 df A TIBLE:6 x 4 >日期键值 > >1 2012-01-16车站1 5278。流量cfs >2012年1月17日第5255站。流量cfs >3 2012-01-18车站15207。流量cfs >4 2012-01-19车站15178。流量cfs >5 2012-01-20车站1 5595。流量cfs >6 2012-01-21车站11666。流量cfs 底图 gg1这里有一种方法,使用tidyverse元包中的dplyr和tidyr为Station2流量的每个正范围创建一个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
编辑2:

原始海报提供了一个更大的数据样本,暴露了两个我没有考虑过的边缘案例。价值为1 NA;易于过滤。两种情况下,一天归零,因此是一个范围的开始和结束。处理此问题的一种方法是将开始和结束定义为第一个和最后一个正值。下面的代码似乎适用于较大的数据

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))
比如:

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)

每天只画一个矩形最简单。

谢谢Jon!这对这个样本数据有效,但对更长的样本数据却不起作用。spread抱怨重复。在我使用tibble::rowid_to_列修复它之后,dateRanges被弄乱了。你能用这个检查一下你的代码吗?仔细看,有一些我没有计划好的边缘情况,包括NA值和某些情况下序列之间的间隔只有一天,所以这些天都是两个不同序列的开始和结束。编辑添加了更健壮的脚本,似乎可以处理更大的数据。哈!当你指出这一点时,这似乎是显而易见的。稍后我再看一看。狂妄自大,再来一次,充满热情!
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)