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

如何在ggplot2中按Season变量为图表区域添加带透明度的着色

为ggplot2图表按Season添加区域着色的解决方案

你需要按season变量("Lean Season"、"Not Lean Season")为图表添加带透明度的区域着色,核心问题是原数据的日期为离散观测点,需先整理出每个季节的连续时间区间,再用geom_rect实现区域填充。以下是完整可运行方案:

步骤1:整理季节时间区间

从原数据中提取连续相同季节的起始、结束日期,生成用于绘制区域的辅助数据框:

library(tidyverse)
library(lubridate)

# 读取原数据
df <- read_csv("date,treatment,season,fcs
               2020-12-01,Comparison,Not Lean Season,30.745913290689405
               2020-12-01,Programme,Not Lean Season,32.58976109215016
               2021-01-01,Comparison,Not Lean Season,31.641855447680587
               2021-01-01,Programme,Not Lean Season,29.246535796766764
               2021-04-01,Comparison,Not Lean Season,45.36691542288559
               2021-04-01,Programme,Not Lean Season,44.84256926952142
               2021-05-01,Comparison,Not Lean Season,45.08060453400504
               2021-05-01,Programme,Not Lean Season,47.6203007518797
               2021-06-01,Comparison,Lean Season,42.512285012285005
               2021-06-01,Programme,Lean Season,39.663414634146356
               2021-07-01,Comparison,Lean Season,41.29671717171716
               2021-07-01,Programme,Lean Season,42.87848101265825
               2021-08-01,Comparison,Lean Season,49.14609571788413
               2021-08-01,Programme,Lean Season,46.7807881773399
               2021-09-01,Comparison,Lean Season,43.86548223350254
               2021-09-01,Programme,Lean Season,44.60335917312663
               2021-10-01,Comparison,Not Lean Season,47.30050505050503
               2021-10-01,Programme,Not Lean Season,46.892768079800504
               2021-11-01,Comparison,Not Lean Season,47.510126582278474
               2021-11-01,Programme,Not Lean Season,48.77791563275434
               2021-12-01,Comparison,Not Lean Season,40.92144638403991
               2021-12-01,Programme,Not Lean Season,41.779556650246306
               2022-01-01,Comparison,Not Lean Season,41.12373737373736
               2022-01-01,Programme,Not Lean Season,40.87468671679198
               2022-03-01,Comparison,Not Lean Season,36.51898734177217
               2022-03-01,Programme,Not Lean Season,36.24120603015074
               2022-04-01,Comparison,Not Lean Season,39.14631043256998
               2022-04-01,Programme,Not Lean Season,39.53708439897699
               2022-05-01,Comparison,Not Lean Season,38.94874999999999
               2022-05-01,Programme,Not Lean Season,37.891857506361326
               2022-06-01,Comparison,Lean Season,37.82133676092546
               2022-06-01,Programme,Lean Season,37.12113402061855
               2022-07-01,Comparison,Lean Season,37.54615384615384
               2022-07-01,Programme,Lean Season,36.67179487179487
               2022-08-01,Comparison,Lean Season,38.99488491048593
               2022-08-01,Programme,Lean Season,37.49869109947643
               2022-09-01,Comparison,Lean Season,41.6801007556675
               2022-09-01,Programme,Lean Season,41.51658163265308
               2022-10-01,Comparison,Not Lean Season,41.67602040816327
               2022-10-01,Programme,Not Lean Season,43.49354005167959
               2022-11-01,Comparison,Not Lean Season,52.11023622047246
               2022-11-01,Programme,Not Lean Season,52.943243243243224
               2022-12-01,Comparison,Not Lean Season,49.45025510204082
               2022-12-01,Programme,Not Lean Season,50.28481012658228
               2023-03-01,Comparison,Not Lean Season,19.80569251456746
               2023-03-01,Programme,Not Lean Season,20.968145869947254")

# 生成季节区间数据框
df_seasons <- df %>%
  distinct(date, season) %>%
  arrange(date) %>%
  mutate(
    next_date = lead(date),
    end_date = ifelse(is.na(next_date), date %m+% months(1) - days(1), next_date - days(1))
  ) %>%
  select(season, start_date = date, end_date) %>%
  mutate(across(c(start_date, end_date), ymd))

步骤2:绘制带区域着色的图表

先添加geom_rect绘制季节区域(放在最底层,避免覆盖线条和点),再保留原有绘图元素:

ggplot() +
  # 添加季节区域着色
  geom_rect(data = df_seasons,
            aes(xmin = start_date, xmax = end_date,
                ymin = -Inf, ymax = Inf, fill = season),
            alpha = 0.2) +
  # 原有的绘图元素
  geom_hline(yintercept = 0, linetype = "solid", color = "black") +
  geom_line(data = df, aes(date, fcs, color = treatment)) +
  geom_point(data = df, aes(date, fcs, shape = treatment), size = 3) +
  scale_x_date(breaks = unique(df$date), labels = scales::date_format("%b %Y")) +
  scale_fill_manual(values = c("Lean Season" = "#d6e8f5", "Not Lean Season" = "#f5e8d6")) +
  labs(
    x = "",
    y = "Impact on Food Consumption Score",
    color = "",
    fill = "",
    shape = ""
  ) +
  theme_minimal(base_size = 15) +
  theme(
    panel.background = element_rect(fill = "white", colour = "white"),
    plot.background = element_rect(fill = "white", colour = "white"),
    legend.position = "bottom",
    panel.grid.minor.x = element_blank(),
    axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)
  )

关键说明

  • 生成df_seasons时,通过lead(date)获取下一个观测日期,将当前季节的结束日期设为下一个日期的前一天;最后一个季节的结束日期设为当前日期的下一个月第一天减一天,确保区间连续覆盖整个时间范围。
  • geom_rect的ymin和ymax设为-Inf和Inf,让着色区域覆盖整个y轴高度。
  • 调整alpha参数控制透明度,scale_fill_manual可自定义季节填充颜色。
  • 图层顺序:geom_rect需放在最前面,保证线条和点显示在着色区域上方。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:57:32