如何在ggplot分面柱状图标签中同时显示百分比与计数?
解决方案
要在按Cycle分面的柱状图标签中同时显示百分比和样本计数,核心是提前计算每个分组的计数与百分比,再将两者合并为统一的标签文本,最后用geom_text渲染。以下是具体实现步骤:
1. 加载依赖包
先确保加载tidyverse(包含数据处理的dplyr和绘图的ggplot2):
library(tidyverse)
2. 数据预处理(关键步骤)
假设你的原始数据框名为df,包含分面变量Cycle、柱状图分类变量Category(对应x轴)。按Cycle和Category分组统计计数、百分比,并生成组合标签:
df_summary <- df %>% group_by(Cycle, Category) %>% summarise(n = n(), .groups = "drop") %>% # 统计每个分组的样本数 group_by(Cycle) %>% # 按分面维度计算百分比 mutate(pct = scales::percent(n / sum(n), accuracy = 1)) %>% # 保留整数百分比,可调整accuracy参数 mutate(label = paste0(pct, "\n(n=", n, ")")) # 合并百分比与计数,换行显示更清晰
3. 绘制分面柱状图
用处理后的汇总数据绘图,geom_col绘制柱状图,geom_text添加组合标签:
ggplot(df_summary, aes(x = Category, y = n, fill = Category)) + geom_col() + geom_text(aes(label = label), position = position_stack(vjust = 0.5), # 堆叠柱状图时居中显示标签 # 若为分组柱状图,改用position = position_dodge(width = 0.9), vjust = -0.5 size = 3) + facet_wrap(~Cycle) + # 按Cycle分面 labs(x = "分类", y = "样本数", title = "按Cycle分面的柱状图(含百分比与计数)") + theme_bw()
注意事项
- 如果你的柱状图是按百分比而非绝对数绘制,只需将
geom_col的y映射改为pct,但更建议用绝对数绘图、百分比放在标签,数据展示更直观 - 可调整
label格式,比如去掉换行写成paste0(pct, " (n=", n, ")"),或修改scales::percent的accuracy参数调整百分比小数位数 - 标签位置可通过
vjust、hjust或position参数微调,避免重叠
模拟数据测试
若需验证效果,可先用以下模拟数据测试:
set.seed(123) # 生成模拟数据 df <- tibble( Cycle = rep(c("Cycle1", "Cycle2", "Cycle3"), each = 200), Category = sample(c("A", "B", "C", "D"), 600, replace = TRUE, prob = c(0.3, 0.25, 0.2, 0.25)) ) # 按上述步骤处理并绘图 df_summary <- df %>% group_by(Cycle, Category) %>% summarise(n = n(), .groups = "drop") %>% group_by(Cycle) %>% mutate(pct = scales::percent(n / sum(n), accuracy = 1)) %>% mutate(label = paste0(pct, "\n(n=", n, ")")) ggplot(df_summary, aes(x = Category, y = n, fill = Category)) + geom_col() + geom_text(aes(label = label), position = position_stack(vjust = 0.5), size = 3) + facet_wrap(~Cycle) + theme_bw()
内容的提问来源于stack exchange,提问作者Chloé
相关产品推荐
相关产品推荐

