如何用ggplot2绘制按年份分组展示周数的柱状图?
实现分组X轴的两种方案
方案1:使用分面(Facet)拆分年份
这是最直观且易维护的方式,将不同年份的周数拆分为独立的子图区域,每个区域对应自己的X轴:
library(ggplot2) dat <- data.frame( weeks = c(23,24,25,26,23), year = c(2022,2022,2022,2023,2023), cases = c(70,98,69,430,56) ) ggplot(data=dat, aes(x=factor(weeks), y=cases)) + geom_bar(stat="identity", fill="#2E86AB") + # 按年份横向分面,自定义分面标签 facet_grid(. ~ year, labeller = labeller(year = function(x) paste0(x, "年周数"))) + labs(x = NULL) + # 移除主X轴标签,分面标签已说明分组 # 调整分面样式 theme(strip.background = element_rect(fill="#F2F2F2"), strip.text = element_text(size=12, face="bold"))
方案2:同一图内实现X轴分组
如果需要在同一个坐标系下展示所有数据,同时用视觉元素拆分年份分组,可以通过合并X轴变量+自定义标注实现:
library(ggplot2) dat <- data.frame( weeks = c(23,24,25,26,23), year = c(2022,2022,2022,2023,2023), cases = c(70,98,69,430,56) ) ggplot(data=dat, aes(x=interaction(year, weeks, sep = "\n"), y=cases)) + geom_bar(stat="identity", fill="#2E86AB") + # 仅显示周数作为X轴标签 scale_x_discrete(breaks = c("2022\n23", "2022\n24", "2022\n25", "2023\n26", "2023\n23"), labels = c("23", "24", "25", "26", "23")) + labs(x = "周数") + # 添加分组分隔线和年份标题 annotate("segment", x=3.5, xend=3.5, y=0, yend=max(dat$cases)+20, color="gray50", linetype="dashed") + annotate("text", x=2, y=max(dat$cases)+30, label="2022年周数", size=4, fontface="bold") + annotate("text", x=4.5, y=max(dat$cases)+30, label="2023年周数", size=4, fontface="bold")
说明
- 方案1适合需要清晰区分不同年份数据的场景,子图独立展示,无需额外标注
- 方案2适合在同一坐标系下对比跨年份的周数据,通过分隔线和标题实现分组视觉区分
内容的提问来源于stack exchange,提问作者LivingstoneM
相关产品推荐
相关产品推荐

