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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:56:45