如何用ggplot绘制主次Y轴图表:主Y轴为死亡概率因子,次Y轴为分箱计数
问题描述
想要绘制如下图表:
- X轴:分箱处理的连续型DNA浓度(对应列
x_bin) - 主Y轴:死亡概率(
Death_prob,0代表存活,1代表死亡) - 次Y轴:每个分箱中对应
Death_prob分组的样本计数(以蓝色系分组条形图展示)
已完成X轴与主Y轴内容的绘制,但无法在次Y轴上为Death_prob的0、1分组分别绘制对应条形图。
数据示例
汇总后的数据:
head(data2) # A tibble: 6 x 3 x_bin Death_prob Val <fct> <int> <int> 1 (0.668,2.39] 0 49 2 (0.668,2.39] 1 3 3 (2.39,4.11] 0 92 4 (2.39,4.11] 1 8 5 (4.11,5.84] 0 27 6 (4.11,5.84] 1 8
原始数据:
> head(df) X Sample Death_prob DNA_concentr x_bin 1 12906 1 1.599731 (0.668,2.39] 2 12907 0 1.711472 (0.668,2.39] 3 12910 0 1.861115 (0.668,2.39] 4 12911 1 4.749104 (4.11,5.84] 5 12913 0 1.633699 (0.668,2.39] 6 12918 0 4.003156 (2.39,4.11]
解决方案
使用ggplot2实现双Y轴+分组条形图,步骤如下:
1. 计算死亡概率
基于汇总数据data2,计算每个分箱的死亡概率:
library(dplyr) prob_data <- data2 %>% group_by(x_bin) %>% mutate(total = sum(Val), prob = Val / total) %>% filter(Death_prob == 1) # 提取死亡组的概率值,对应主Y轴
2. 绘制双Y轴图表
library(ggplot2) # 初始化画布,添加次Y轴的分组条形图 p <- ggplot() + geom_bar(data = data2, aes(x = x_bin, y = Val, fill = factor(Death_prob)), stat = "identity", position = position_dodge(width = 0.8), # 实现同一分箱下的条形分组 width = 0.7, alpha = 0.7) + # 添加主Y轴的死亡概率点线图(按次Y轴最大值做比例转换,保证刻度对齐) geom_point(data = prob_data, aes(x = x_bin, y = prob * max(data2$Val)), size = 3, color = "red") + geom_line(data = prob_data, aes(x = x_bin, y = prob * max(data2$Val), group = 1), color = "red", linewidth = 1) + # 设置双Y轴刻度 scale_y_continuous( name = "死亡概率", sec.axis = sec_axis(~ . / max(data2$Val), name = "样本计数"), limits = c(0, max(data2$Val)) ) + # 调整坐标轴与图例样式 scale_x_discrete(name = "DNA浓度分箱") + scale_fill_manual(name = "分组", values = c("0" = "lightblue", "1" = "darkblue")) + theme_minimal() + theme(legend.position = "top") print(p)
关键说明
- 双Y轴的核心是将主Y轴的概率值按次Y轴的最大值做比例转换,确保两个轴的刻度范围匹配
position_dodge参数用于实现同一分箱下Death_prob0、1组的条形并排展示- 可根据需求调整点线样式、条形颜色、图例位置等细节
内容的提问来源于stack exchange,提问作者startR
相关产品推荐
相关产品推荐

