如何在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
相关产品推荐
相关产品推荐

