如何在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
相关产品推荐
相关产品推荐

