如何在R中将每日数据叠加绘制在月度数据之上
R绘制双层日期计数图表解决方案
问题背景
有跨11个月的日期数据(示例如下),需要绘制双层图表:底层为月度数据计数的柱状图,顶层为每日数据计数的柱状图。
示例数据:
Intake.Date = c("2023-01-26", "2023-01-26", "2023-01-26", "2023-01-26", "2023-01-26", "2023-01-26", "2023-01-26","2023-02-02", "2023-01-31", "2023-02-07", "2023-01-31", "2023-02-16", "2023-02-18", "2023-02-18","2023-03-02", "2023-03-02", "2023-03-02", "2023-03-06", "2023-03-06", "2023-03-06", "2023-03-08")
原尝试的问题
- 首次用
geom_histogram指定bins=11,但直方图的等宽区间无法匹配自然月份(各月天数不同),导致月度计数的柱子范围错误。 - 二次尝试将日期转为月份缩写后绘制,因x轴同时存在字符型(月度)和日期型(每日)数据,类型不兼容触发报错:
Error in
mapped_discrete(): ! Can't convertxto .
Runrlang::last_trace()to see where the error occurred.
解决步骤
1. 数据预处理
首先将字符型日期转为Date类型,再分别聚合月度、每日的计数:
library(dplyr) library(lubridate) # 构造数据集并转换日期格式 AFOBC_Pathology_Data <- data.frame(Intake.Date = as.Date(Intake.Date)) # 计算月度计数(按月份起始日期分组) monthly_counts <- AFOBC_Pathology_Data %>% mutate(Month = floor_date(Intake.Date, "month")) %>% count(Month, name = "Monthly_Count") # 计算每日计数 daily_counts <- AFOBC_Pathology_Data %>% count(Intake.Date, name = "Daily_Count")
2. 绘制双层图表
用geom_col分别绘制月度、每日柱子,确保x轴统一为日期类型,通过宽度参数适配两种柱子的显示范围:
library(ggplot2) ggplot() + # 底层月度柱状图:宽度适配月份跨度 geom_col(data = monthly_counts, aes(x = Month, y = Monthly_Count), fill = "grey", width = 25) + # 顶层每日柱状图:宽度设为1对应单天 geom_col(data = daily_counts, aes(x = Intake.Date, y = Daily_Count), fill = "cyan", width = 1) + # x轴按月份格式化显示 scale_x_date(date_labels = "%b %Y", date_breaks = "1 month") + labs(x = "日期", y = "计数") + theme_minimal()
关键说明
- 统一x轴为
Date类型,避免类型不兼容报错。 - 用
floor_date将日期映射到当月起始日,确保月度柱子与x轴日期对齐。 - 通过
width参数调整柱子宽度:月度柱子设为25左右(适配平均月份天数),每日柱子设为1(对应单天宽度),保证两层图表的视觉层次清晰。
内容的提问来源于stack exchange,提问作者user2954167
相关产品推荐
相关产品推荐

