求助:基于R语言ggplot2绘制分组日期的时间序列分布图
实现按日期分组的月度时间序列折线图(分年子图)
以下是基于R语言tidyverse和lubridate包的实现方案,完全匹配你的需求:
步骤说明
- 数据预处理:从日期列提取年份、月份、日信息,并将日期划分为指定的三个分组
- 分面绘图:通过分面功能实现「日期分组+年份」的子图布局,X轴设为月份,每条折线对应一个具体日期
完整代码
# 加载所需包 library(tidyverse) library(lubridate) # 假设你的数据框名为df,日期列名为date,数值列名为value # 数据预处理 df_processed <- df %>% # 将日期列转换为Date类型(若未转换) mutate(date = ymd(date)) %>% # 提取年、月、日信息 mutate( year = year(date), month = month(date, label = TRUE, abbr = TRUE), # 月份转为缩写名称(如Jan, Feb) day = day(date), # 划分日期分组 day_group = case_when( day %in% 1:10 ~ "1-10日", day %in% 11:20 ~ "11-20日", day %in% 21:31 ~ "21-31日" ) ) %>% # 仅保留2020和2021年的数据 filter(year %in% c(2020, 2021)) %>% # 将日期分组转为因子,保证顺序正确 mutate(day_group = factor(day_group, levels = c("1-10日", "11-20日", "21-31日"))) # 绘制折线图 ggplot(df_processed, aes(x = month, y = value, color = factor(day), group = factor(day))) + geom_line(alpha = 0.8, linewidth = 0.6) + # 调整线条透明度和宽度,缓解拥挤 # 分面:按日期分组行,年份列,子图独立展示 facet_grid(day_group ~ year) + # 自定义标签与标题 labs( x = "月份", y = "数值", color = "日期", title = "2020-2021年每日数值月度分布", subtitle = "按日期分组展示" ) + theme_minimal() + theme( legend.position = "bottom", # 图例移至底部节省空间 axis.text.x = element_text(angle = 45, hjust = 1), # X轴标签旋转避免重叠 strip.text = element_text(size = 10, face = "bold") # 分面标题加粗突出 )
关键细节解释
- 日期分组:用
case_when划分三组并转为因子,避免分组顺序混乱 - 月份处理:
month(date, label = TRUE)将月份转为可读性更强的缩写,X轴自动按时间顺序排列 - 分面布局:
facet_grid(day_group ~ year)实现「日期分组上下排列、年份左右排列」的布局,若偏好横向排列可替换为facet_wrap(day_group ~ year, ncol = 2) - 线条优化:设置
alpha透明度和linewidth宽度,缓解同组内多条折线的重叠问题 - 样式调整:通过
theme参数优化图例位置、轴标签显示效果,提升图表可读性
如果你的原始周分布代码有特定样式需求,可将对应参数(如颜色主题、线条类型)替换到上述代码中。
内容的提问来源于stack exchange,提问作者Bella_18
相关产品推荐
相关产品推荐

