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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:40:59