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

如何在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")

原尝试的问题

  1. 首次用geom_histogram指定bins=11,但直方图的等宽区间无法匹配自然月份(各月天数不同),导致月度计数的柱子范围错误。
  2. 二次尝试将日期转为月份缩写后绘制,因x轴同时存在字符型(月度)和日期型(每日)数据,类型不兼容触发报错:

Error in mapped_discrete(): ! Can't convert x to .
Run rlang::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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:42:51