我正在寻找一种突出显示图中某些部分的自动方法,这些部分的Consumer
值大于预定义的阈值(在这种情况下为0)。在检查绘图后,可以通过在数据框(Station2
)中指定Date
来手动完成此操作。
预先感谢您的任何建议!
dateRanges
由reprex package(v0.3.0)于2019-06-28创建
答案 0 :(得分:1)
这是一种使用dplyr
元数据包中的tidyr
和tidyverse
在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))
答案 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
是最简单的。