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

