如何在ggplot2堆叠条形图中添加分组症状阳性率百分比标签
解决方案:ggplot2堆叠条形图添加分组分症状百分比标签
步骤1:数据预处理(计算阳性率与标签位置)
首先将数据整理为长格式(若你的数据已是长格式可跳过宽转长步骤),再按组别和症状分组计算阳性百分比,同时计算每个堆叠块的居中位置(用于放置标签)。
假设你的原始数据是宽格式(每一行对应1位患者,列包含组别和各症状的0/1值),示例代码如下:
library(dplyr) library(tidyr) library(ggplot2) # 示例数据(替换为你的真实数据) set.seed(123) df <- data.frame( group = rep(c("Group1", "Group2", "Group3", "Group4"), each = 50), symptom1 = sample(c(0,1), 200, replace = TRUE, prob = c(0.7, 0.3)), symptom2 = sample(c(0,1), 200, replace = TRUE, prob = c(0.5, 0.5)), symptom3 = sample(c(0,1), 200, replace = TRUE, prob = c(0.6, 0.4)) ) # 数据转换与统计计算 df_long <- df %>% # 宽格式转长格式:将各症状列合并为symptom和positive两列 pivot_longer(cols = starts_with("symptom"), names_to = "symptom", values_to = "positive") %>% # 按组别+症状分组,计算阳性率 group_by(group, symptom) %>% summarise( total = n(), positive_num = sum(positive), pct = positive_num / total * 100 # 计算百分比 ) %>% ungroup() %>% # 按组别分组,计算每个堆叠块的居中位置(累计百分比减去自身一半) group_by(group) %>% mutate(cum_pct = cumsum(pct) - pct / 2) %>% ungroup()
步骤2:绘制带百分比标签的堆叠条形图
使用处理后的数据绘图,通过geom_text将百分比标签放置在每个堆叠块的居中位置:
ggplot(df_long, aes(x = group, y = pct, fill = symptom)) + geom_bar(stat = "identity", width = 0.7) + # 绘制堆叠条形 # 添加百分比标签,保留1位小数 geom_text(aes(label = sprintf("%.1f%%", pct)), y = df_long$cum_pct, size = 3.5) + # 自定义标签与主题 labs( x = "组别", y = "阳性患者百分比", fill = "症状类型", title = "不同组别各症状阳性率分布" ) + scale_fill_brewer(palette = "Set2") + # 自定义填充色(可选) theme_minimal()
关键说明
- 若你的数据已是长格式(每行对应1个组别+1个症状的记录),只需保留
group_by至mutate的统计计算部分。 sprintf("%.1f%%", pct)用于格式化百分比显示,可根据需求调整小数位数(如%.0f%%显示整数百分比)。cum_pct的计算确保标签精准落在每个堆叠块的垂直中心,避免标签偏移。
内容的提问来源于stack exchange,提问作者Vojtech Petr
相关产品推荐
相关产品推荐

