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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:46:01