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

如何在ggplot2指定x、y的柱形图中添加Year变量的计数?

在ggplot柱形图上添加每年研究数量(无需新增数据列)

你可以通过ggplot的统计函数和after_stat()工具,不用新增数据列就能实现需求,下面给两种常用方案:

方案1:在柱顶标注研究数量

直接在柱形图上方添加对应年份的研究数量,核心是用geom_text结合统计函数自动计算每组的行数:

library(ggplot2)
library(dplyr)

# 你的数据(模拟)
histo <- tibble(
  Year = as.character(c(1994, 1996, 1996, 1996, 1996, 1997, 1997)),
  Cases = c(12, 1, 2, 6, 10, 3, 7)
)

histo %>%
  ggplot(aes(x = Year)) +
  # 绘制每年总病例数柱形图(stat="sum"自动汇总同年份病例)
  geom_bar(aes(y = Cases), stat = "sum", width = 0.7, color = "black", fill = "lightblue") +
  # 添加研究数量标注:用stat="count"统计年份出现次数,after_stat获取计算结果
  geom_text(
    stat = "count", 
    aes(label = after_stat(count), y = after_stat(sum(Cases)) + 1), # y轴偏移避免和柱顶重叠
    size = 4
  ) +
  labs(y = "总病例数")

方案2:添加第二X轴显示研究数量

如果想把研究数量放在X轴位置(比如主X轴下方),可以用scale_x_discrete的sec.axis参数,结合ave函数实时计算每组行数:

histo %>%
  ggplot(aes(x = Year)) +
  geom_bar(aes(y = Cases), stat = "sum", width = 0.7, color = "black", fill = "lightblue") +
  scale_x_discrete(
    sec.axis = dup_axis(
      labels = ~ ave(rep(1, length(.x)), .x, FUN = length), # 计算每个年份的研究数量
      name = "研究数量"
    )
  ) +
  labs(y = "总病例数")

补充说明

你之前用stat_count报错,是因为主图层已经指定了y=Cases,而stat_count默认是基于x轴变量计算频数,不需要y参数,两者冲突。上面的方法是把统计计算限定在对应的图层内,或者用向量计算的方式绕开冲突,完全不需要修改原始数据添加新列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:22:36