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

求助:如何在ggplot中叠加填充柱状图与步阶统计图形?

合并ggplot填充柱状图与步阶图的实现方案

要在彩色填充柱状图上叠加展示ox_0计数的步阶图,核心是利用ggplot的图层叠加机制,同时处理双y轴的刻度转换(因为柱状图是百分比比例,步阶图是原始计数)。以下是完整的实现代码:

# 提前定义数据子集与总样本数,简化代码并保证数据一致性
data_sub <- subset(stw, !is.na(will))
total_n <- nrow(data_sub)

ggplot(data_sub, aes(ox_0, fill=will)) +
    # 保留原填充柱状图设置
    geom_bar(position="fill") +
    # 叠加步阶图,将计数转换为比例匹配左侧轴,后续通过右侧轴还原计数
    stat_bin(geom="step", binwidth = 1, aes(y = after_stat(count)/total_n), 
             color = "black", size = 1) +
    # 标题与坐标轴基础设置
    ggtitle("Willingness to repeat surgery per Oxford Knee Score at baseline") +
    xlab("Preoperative Oxford Knee Score") +
    ylab("Proportion") +
    # 设置双y轴:左侧为百分比比例,右侧为原始患者计数
    scale_y_continuous(
        labels = scales::percent_format(scale = 100),
        sec.axis = sec_axis(~ . * total_n, name = "Count of Patients")
    ) +
    # 原主题设置,新增右侧y轴标题样式保证视觉统一
    theme(
        axis.text.y = element_text(size=12, color=1),
        axis.title.x = element_text(size=15, color=1),
        axis.text.x = element_text(size=12, color=1),
        axis.title.y = element_text(size=15, color=1),
        axis.title.y.right = element_text(size=15, color=1),
        plot.title = element_text(hjust=0.5, size=16),
        strip.text.x = element_text(size=12),
        legend.text = element_text(size=13),
        legend.title = element_text(size=15)
    ) +
    scale_fill_manual("Would you repeat surgery?", values=col.traf, aesthetics = "fill")

关键修改说明:

  • 提前提取数据子集和总样本数,避免重复代码,确保图层使用的数据源完全一致
  • 步阶图的y轴映射转换为after_stat(count)/total_n,让计数与左侧比例轴的刻度范围匹配,再通过右侧轴的转换公式还原为原始计数
  • 给步阶图设置黑色粗线条,与彩色柱状图形成视觉区分
  • 扩展主题设置,补充右侧y轴标题的样式,保持整体视觉风格统一
  • 使用scales::percent_format自动生成百分比标签,比手动定义更灵活通用

注意事项:

  • 双y轴可能存在视觉误导,需确保读者清晰理解两个轴的不同含义
  • 若ox_0是离散型变量,可调整binwidth参数或改用stat_count替代stat_bin

内容的提问来源于stack exchange,提问作者Anne MP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:17:43