You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用geom_rect按指示变量列填充颜色高亮时间序列区域

实现方案

核心思路

你需要先从原始数据中提取连续Ind=1的时间区间,生成独立的区间数据集,再将该数据集传入geom_rect()即可实现动态高亮,不需要手动指定区间,完全适配你的指示变量列。

具体实现步骤

1. 依赖包准备

需要用到tidyverse系列包(包含dplyr用于数据处理、ggplot2用于绘图),未安装可先执行安装:

install.packages("tidyverse")
library(tidyverse)

2. 构造原始数据(可直接替换为自己的数据集)

df <- tibble(
  Date = as.Date(c("2019-10-07", "2019-10-14", "2019-10-21", "2019-10-28", "2019-11-04", 
                   "2019-11-11", "2019-11-18", "2019-11-25", "2019-12-02", "2019-12-09", 
                   "2019-12-16", "2019-12-23", "2019-12-30")),
  Count = c(373355, 374307, 365673, 354055, 361637, 349578, 372917, 358007, 348158, 
            337528, 337553, 168532, 223439),
  Ind = c(0,0,0,0,1,1,1,1,1,0,0,0,0)
)

3. 生成高亮区间数据集

用data.table的rleid函数识别连续的相同Ind值,提取所有Ind=1的时间段:

# 未安装data.table可先执行:install.packages("data.table")
library(data.table)
highlight_df <- df %>%
  # 给连续相同的Ind值分配同一个组ID
  mutate(ind_group = data.table::rleid(Ind)) %>%
  # 筛选Ind=1的组,若需要给Ind=0也加填充可删掉这行
  filter(Ind == 1) %>%
  # 按组计算区间的起止时间
  group_by(ind_group) %>%
  summarise(
    xmin = min(Date),
    xmax = max(Date),
    Ind = first(Ind)
  )

4. 绘图

ggplot() +
  # 先画高亮矩形,放在底层避免挡住折线
  geom_rect(
    data = highlight_df,
    aes(xmin = xmin, xmax = xmax, ymin = -Inf, ymax = Inf, fill = as.factor(Ind)),
    alpha = 0.3 # 调整透明度
  ) +
  # 再画时间序列折线
  geom_line(data = df, aes(x = Date, y = Count), linewidth = 1) +
  # 自定义填充色,可按需修改
  scale_fill_manual(values = c("1" = "red"), name = "高亮区间") +
  labs(x = "日期", y = "统计值") +
  theme_bw()

可选调整项

  • 如果需要给Ind=0的区域也加不同颜色的填充,去掉生成highlight_df时的filter(Ind == 1)语句即可,同时在scale_fill_manual里新增0对应的颜色值
  • 调整alpha参数可修改高亮区域的透明度,避免遮挡折线
  • 存在多段不连续的Ind=1区间时代码会自动识别生成多个矩形,无需额外修改

内容的提问来源于stack exchange,提问作者mcvasil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:36:04