如何基于tsibble分组内单行列值条件设置整组字段值用于ggplot绘图
解决方案
全程使用tidyverse向量化语法即可实现,无需编写过程式循环,实现难度很低。
步骤1:定义校验参数
首先定义你需要的校验规则参数:
# 待校验的指定日期 day_to_test <- 5 # closePct的有效区间 min_val <- -0.5 max_val <- 0.5
步骤2:批量计算isMatch标识
利用dplyr分组广播特性,一次完成有效日期查找、规则校验、分组全量同步标识三个操作:
library(dplyr) library(ggplot2) data_processed <- data %>% # 按年份分组 group_by(year) %>% mutate( # 取大于等于待校验日的最小日期对应的closePct,若该年份无符合要求的日期则返回NA target_pct = closePct[day >= day_to_test][which.min(day[day >= day_to_test])], # 校验值是否在区间内,空值默认算不匹配,结果自动同步到该年份所有行 isMatch = !is.na(target_pct) & between(target_pct, min_val, max_val) ) %>% ungroup()
逻辑说明:
- 分组后mutate返回长度为1的标量时,dplyr会自动将值复制到该分组的所有行,直接解决你第一个「分组全量同步标识」的需求
day >= day_to_test筛选出该年份所有晚于等于待校验日的条目,which.min(day)取其中最小的日期,即你要的「待校验日无数据则取之后第一个存在的日期」的逻辑
步骤3:绘图实现置灰效果
你可以直接用alpha控制透明度,也可以直接将不匹配的折线统一设为灰色:
ggplot(data_processed, aes(x = day, y = closePct, group = year)) + geom_line(aes( # 匹配的按年份着色,不匹配的统一灰色 color = ifelse(isMatch, as.factor(year), "未匹配"), alpha = isMatch )) + # 手动调整透明度,隐藏透明度图例 scale_alpha_manual(values = c("TRUE" = 1, "FALSE" = 0.2), guide = "none") + # 自定义色板,未匹配的设为浅灰 scale_color_manual( values = c(scales::hue_pal()(length(unique(data_processed$year))), "gray70"), name = "年份" )
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

