如何在ggplot2中绘制带组内百分比标签的离散变量堆叠条形图
解决组内百分比堆叠条形图(带标签)的问题
首先得修正你创建数据框时的小错误:你用c(gender, outcome)把两个向量拼接成了一个长向量,而非包含两列的数据框,这会导致ggplot无法正确识别变量。先重新创建正确的数据框:
gender <- c("male", "female", "male", "male", "female", "female", "male", "female", "female", "male") outcome <- factor(c(0,0,0,1,1,1,0,1,1,1), levels = c(0,1), labels = c("responders", "non-responders")) # 正确创建包含gender和outcome列的数据框 df <- data.frame(gender, outcome)
接下来我们实现你需要的组内百分比堆叠条形图+标签效果,核心是让每个条形展示对应gender组内的占比,而非全局占比:
library(ggplot2) library(scales) # 用于百分比格式化 ggplot(df, aes(x = gender, fill = outcome)) + # 堆叠条形图,position="fill"让每个条形高度为1(代表100%),展示组内占比 geom_bar(position = "fill") + # 将y轴的小数比例转换为百分比显示 scale_y_continuous(labels = percent) + # 添加组内百分比标签,居中显示在每个堆叠块内 geom_text( stat = "count", # 计算当前gender组内的百分比,保留整数 aes(label = percent(after_stat(count)/sum(count), accuracy = 1)), # 让标签在堆叠块垂直居中 position = position_fill(vjust = 0.5) ) + # 优化图表标签,符合发表规范 labs( x = "Gender", y = "Percentage", fill = "Outcome" ) + # 使用简洁的黑白主题,适合学术发表 theme_bw()
代码解释:
position = "fill":这是实现组内占比的关键,它会把每个x轴分组(gender)的条形高度统一拉伸到1,每个堆叠部分的高度就是该分类在组内的比例。scale_y_continuous(labels = percent):把y轴的小数(比如0.4)转换成易读的百分比格式(40%)。geom_text部分:通过stat="count"自动统计每个分组的计数,after_stat(count)/sum(count)计算当前gender组内的占比,position_fill(vjust=0.5)确保标签精准居中在每个堆叠块里。theme_bw():替换默认的灰色背景,生成更适合学术发表的简洁图表样式。
这样生成的图表就会满足你的需求:每个gender的条形展示组内responders和non-responders的占比,并且每个堆叠块内都有对应的百分比标签。
内容的提问来源于stack exchange,提问作者Pashtun
相关产品推荐
相关产品推荐

