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

如何生成按治疗分层、带类别虚线的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:15:59