如何生成按治疗分层、带类别虚线的8类有序结局水平堆叠条形图?
带类别分隔虚线的分层堆叠水平条形图实现方案
不需要额外专用包,用ggplot2配合tidyverse的数据预处理就能实现你要的效果。核心思路是先计算每个治疗组内各结局类别的累积比例,再用线段绘制仅在对应条形内显示的分隔虚线。
步骤1:构造示例数据(替换为你的真实数据)
library(tidyverse) # 模拟8个有序结局、2个治疗组的频数数据 set.seed(123) dat <- expand.grid( Treatment = c("治疗组A", "治疗组B"), Outcome = paste0("结局", 1:8) # 你的8个有序结局类别 ) %>% mutate(Count = sample(10:50, nrow(.), replace = TRUE)) %>% # 计算每个治疗组内的比例及累积比例 group_by(Treatment) %>% mutate( Prop = Count / sum(Count), Cumulative_Prop = cumsum(Prop) ) %>% ungroup() %>% # 转换治疗组为数值型,用于定位条形的上下边界 mutate(Treatment_y = as.numeric(factor(Treatment))) %>% # 筛选出需要绘制虚线的位置(排除最后一个结局的边界) filter(Outcome != paste0("结局", 8)) %>% # 计算每个条形的上下范围(适配默认条形宽度0.8) mutate( Line_Start = Treatment_y - 0.4, Line_End = Treatment_y + 0.4 )
步骤2:绘制带虚线分隔的堆叠水平条形图
ggplot(dat, aes(y = Treatment, x = Prop, fill = Outcome)) + # 绘制水平堆叠条形 geom_bar( stat = "identity", position = "stack", orientation = "y", width = 0.8 ) + # 绘制结局类别间的分隔虚线 geom_segment( aes( x = Cumulative_Prop, xend = Cumulative_Prop, y = Line_Start, yend = Line_End ), linetype = "dashed", color = "black", alpha = 0.7 ) + # 自定义标签与主题 labs( x = "比例", y = "治疗组", fill = "结局类别" ) + theme_minimal()
关键说明
- 如果你用的是计数而非比例,只需将代码中的
Prop替换为Count,Cumulative_Prop替换为cumsum(Count)即可。 - 调整
width参数可以改变条形宽度,对应的Line_Start和Line_End的加减值也要同步调整(比如宽度设为0.6时,加减值改为0.3)。 - 可以通过修改
linetype、color、alpha参数自定义虚线样式。
内容的提问来源于stack exchange,提问作者Misha
相关产品推荐
相关产品推荐

