如何用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
相关产品推荐
相关产品推荐

