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

如何在ggplot2堆叠柱状图顶部添加总样本量标注?

解决ggplot2堆叠柱状图顶部加总样本量标注的问题

问题说明

要在ggplot2绘制的堆叠柱状图顶部,添加n=XX格式的总样本量标注(每个柱子顶部居中显示斜体的n加样本数),此前使用geom_text仅能给柱状图的每个堆叠分段添加标注,不想用Photoshop手动修改,求代码解决方案。

解决步骤

1. 先计算每个类别的总样本量

先将原始数据按category分组,算出每个类别的总物种数:

# 按category分组求和,得到每个类别的总数
total_counts <- aggregate(count ~ category, data = breadth, sum)
# 生成带斜体n的标注文本
total_counts$label <- paste0("*n*=", total_counts$count)

2. 修改绘图代码添加顶部标注

在原有ggplot代码基础上,新增一层geom_text,使用汇总后的总数数据放置标注,开启parse=TRUE实现n的斜体效果,同时调整y轴位置让标注在柱子顶部上方一点,避免贴合柱边:

完整可运行代码:

# 加载包
library(ggplot2)
library(readxl)
library('showtext')

# 导入数据(若用本地文件,替换为read_excel([你的文件路径])即可)
breadth <- structure(list(breadth = c("Habitat specialist", "Habitat specialist", 
"Habitat specialist", "Habitat generalist", "Habitat generalist", 
"Habitat generalist"), category = c("Non-cacher", "Non-specialised cachers", 
"Specialised cachers", "Non-cacher", "Non-specialised cachers", 
"Specialised cachers"), count = c(0, 2, 10, 3, 30, 10)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -6L))

# 定义配色
cbPalette <- c("#b9503d", "#43c9b0")

# 设置字体
font_add(family = "Arial", regular = "Arial.ttf")
showtext_auto()

# 计算每个类别的总样本量
total_counts <- aggregate(count ~ category, data = breadth, sum)
total_counts$label <- paste0("*n*=", total_counts$count)

# 绘图并添加顶部标注
ggplot(breadth, aes(fill=breadth, y=count, x=category)) + 
  geom_bar(position='stack', stat='identity') +
  # 关键:添加顶部总样本量标注
  geom_text(data = total_counts, aes(x = category, y = count + 1, label = label),
            parse = TRUE, family = "Arial", size = 4) +
  labs(fill='Habitat breadth', x='', y='Number of species') +
  scale_fill_manual(values=cbPalette) +
  theme_classic() +
  theme(axis.text.x = element_text(size = 13), axis.title.y = element_text(size = 12)) +
  theme(text = element_text(family = "Arial")) +
  theme(axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 0))) +
  scale_x_discrete(labels=c('Non-cacher', 'Generalist cacher', 'Specialist cacher'))

代码关键点

  • aggregate函数快速按类别汇总总数,无需手动计算
  • paste0("*n*=", ...)生成标注文本,*n*通过parse=TRUE解析为斜体格式
  • y = count + 1控制标注在柱子顶部上方1个单位的位置,可根据图表实际高度调整偏移量
  • geom_text指定data = total_counts,确保使用汇总后的总数数据而非原始堆叠数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:47:32