求助:如何在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
相关产品推荐
相关产品推荐

