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

如何用R中的汇总数据创建分组水平堆叠条形图?

解决方案

你的数据结构本身没问题,但因为只有发生结局的比例,需要先补充未发生结局的比例(即100减去对应比例),转换成ggplot需要的长格式数据后,就能生成目标堆叠条形图。

步骤1:加载依赖包

需要用到dplyr处理数据,ggplot2绘图:

library(dplyr)
library(ggplot2)

步骤2:转换数据结构

为每个治疗-结局-年龄组合添加「未发生」类别的行,计算对应比例:

# 生成包含发生/未发生两类的长格式数据
df_processed <- df %>%
  # 保留原数据作为「发生」类别
  mutate(Category = "发生") %>%
  # 追加「未发生」类别,比例为100 - 原比例
  bind_rows(df %>%
              mutate(Category = "未发生",
                     Proportion = 100 - Proportion))

步骤3:生成水平堆叠条形图

方式1:用分面一次性生成两张图

通过facet_wrap按年龄分组,自动生成两张图:

ggplot(df_processed, aes(x = interaction(Treatment, Outcome), y = Proportion, fill = Category)) +
  geom_col(position = "stack") + # 堆叠条形图
  coord_flip() + # 转为水平条形
  facet_wrap(~Age, ncol = 1) + # 按年龄分面,垂直排列两张图
  labs(
    x = "治疗-结局组合",
    y = "比例(%)",
    fill = "结局状态"
  ) +
  theme_bw() # 简洁主题

方式2:分开绘制两张独立图

如果需要单独保存两张图,可分别过滤年龄组绘制:

# 70岁以下男性的图
ggplot(df_processed %>% filter(Age == "<70"), 
       aes(x = interaction(Treatment, Outcome), y = Proportion, fill = Category)) +
  geom_col(position = "stack") +
  coord_flip() +
  labs(x = "治疗-结局组合", y = "比例(%)", fill = "结局状态") +
  ggtitle("70岁以下男性治疗结局比例") +
  theme_bw()

# 70岁以上男性的图
ggplot(df_processed %>% filter(Age == ">70"), 
       aes(x = interaction(Treatment, Outcome), y = Proportion, fill = Category)) +
  geom_col(position = "stack") +
  coord_flip() +
  labs(x = "治疗-结局组合", y = "比例(%)", fill = "结局状态") +
  ggtitle("70岁以上男性治疗结局比例") +
  theme_bw()

关键说明

  • 原始数据是汇总后的宽格式(每个组合仅记录发生比例),而ggplot绘制堆叠图需要长格式数据(每个类别占一行),所以必须补充「未发生」的行。
  • interaction(Treatment, Outcome)会将治疗和结局组合成一个新变量,作为条形图的横轴(翻转后为纵轴),清晰区分每个治疗-结局组合。

内容的提问来源于stack exchange,提问作者Jay Bee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:45:26