You need to enable JavaScript to run this app. R ggplot2绘制多日期列数据的三子图柱状图(x轴日期y轴ID计数)
优惠活动
大模型
产品
解决方案
定价
更多

R ggplot2绘制多日期列数据的三子图柱状图(x轴日期y轴ID计数)

ggplot2实现多日期列的同图分面柱状图方案

宽格式数据无法直接适配ggplot的分层统计逻辑,先把三个独立日期列的结构重塑为长格式,再通过分面或分组映射,就能实现单图内展示三组日期数据的ID计数分布,完全匹配x轴放日期、y轴放对应日期关联ID计数的要求。

具体实现步骤

  • 加载需要的工具包
    整个流程会用到tidyverse生态完成数据重塑和绘图,先执行加载命令:

    library(tidyverse)
    
  • 构造和示例结构完全一致的测试数据

    dat <- data.frame(ID = c(1:80),
                      dat1 = sample(seq(as.Date('2021/01/01'), as.Date('2021/04/01'), by="day"), 80),
                      dat2 = sample(seq(as.Date('2021/01/01'), as.Date('2021/04/01'), by="day"), 80),
                      dat3 = sample(seq(as.Date('2021/01/01'), as.Date('2021/04/01'), by="day"), 80))
    
  • 宽格式数据重塑为长格式
    用pivot_longer把三个日期列合并为统一的日期值列,同时保留每个日期所属的分组标识(区分是dat1/dat2/dat3哪一列的数据):

    dat_long <- dat %>%
      pivot_longer(
        cols = starts_with("dat"),
        names_to = "date_group",
        values_to = "date_value"
      )
    

    转换后的数据每一行对应“某ID-某类日期-具体日期值”的映射关系,可直接用于计数统计,不需要提前手动做分组聚合。

  • 绘制目标图表
    提供两种可直接复用的展示方案,可根据实际对比需求选择:

    1. 独立分面展示(最匹配3个独立barplot同图的需求)
      三个柱状图垂直排布在同一个绘图面板中,各自独立展示对应日期列的计数分布,不会互相遮挡:
      ggplot(dat_long, aes(x = date_value)) +
        # 柱子高度自动统计对应分组下的ID数,也就是y轴需要的关联ID计数
        geom_bar(fill = "#2c7fb8", width = 1) +
        # 按日期类型拆分3个垂直排列的子图
        facet_wrap(~date_group, ncol = 1) +
        labs(
          x = "日期",
          y = "关联ID计数",
          title = "三类日期对应的每日ID计数分布"
        ) +
        # 调整x轴日期的显示间隔,避免标签重叠
        scale_x_date(date_breaks = "2 week", date_labels = "%Y-%m-%d") +
        theme_bw() +
        theme(
          panel.grid.minor = element_blank(),
          axis.text.x = element_text(angle = 45, hjust = 1)
        )
      
    2. 同坐标系并排对比(适合跨组计数差异对比)
      把三个组的柱子放在同一个坐标系下,同一日期位置的三组柱子并排摆放,可直接横向对比不同组的计数差异:
      ggplot(dat_long, aes(x = date_value, fill = date_group)) +
        # 让不同组的柱子在同一x位置并排,避免重叠遮挡
        geom_bar(position = "dodge", width = 0.8) +
        labs(
          x = "日期",
          y = "关联ID计数",
          title = "三类日期对应的每日ID计数分布对比"
        ) +
        scale_x_date(date_breaks = "2 week", date_labels = "%Y-%m-%d") +
        theme_bw() +
        theme(
          panel.grid.minor = element_blank(),
          axis.text.x = element_text(angle = 45, hjust = 1)
        )
      

可选优化说明

如果觉得自动统计的逻辑不够灵活,可以提前手动聚合每个日期的ID计数:

dat_count <- dat_long %>%
  count(date_group, date_value, name = "id_count")

后续绘图时只需指定y值为预计算的id_count,搭配geom_bar(stat = "identity")即可,效果和自动统计完全一致。

可以根据日期粒度调整geom_bar的width参数控制柱子粗细,匹配最终视觉效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 01:57:00