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-某类日期-具体日期值”的映射关系,可直接用于计数统计,不需要提前手动做分组聚合。
绘制目标图表
提供两种可直接复用的展示方案,可根据实际对比需求选择:- 独立分面展示(最匹配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) ) - 同坐标系并排对比(适合跨组计数差异对比)
把三个组的柱子放在同一个坐标系下,同一日期位置的三组柱子并排摆放,可直接横向对比不同组的计数差异: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) )
- 独立分面展示(最匹配3个独立barplot同图的需求)
可选优化说明
如果觉得自动统计的逻辑不够灵活,可以提前手动聚合每个日期的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
相关产品推荐
相关产品推荐

