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

如何在R中绘制y轴为mortality=1占比的直方图

技术求助:R中绘制特定占比的直方图

我需要在R中绘制类似附图的直方图,要求y轴仅显示mortality==1的占比。现有一段代码无法满足需求,恳请提供技术提示。

数据示例

MCV   mortality
100   0
100   1
90    1
70    1
70    0

现有代码

ggplot(data=t, aes(MCV, fill=mortality)) + 
  geom_histogram(aes(y=c(..count..[..group..==1]/sum(..count..))),
                 position='dodge', binwidth=5) +
  ylab("Percentage") +xlab("MCV")

解决方案

要实现y轴显示每个MCV区间内mortality==1的占比,核心是统计每个区间内死亡案例的占比,而非全局占比。以下两种方法可实现需求:

方法1:预处理数据后绘图(直观可控)

先按指定的binwidth分组,计算每个区间的死亡占比,再用柱状图模拟直方图效果:

library(dplyr)
library(ggplot2)

# 对MCV按binwidth=5分组,计算每个区间的mortality=1占比
processed_data <- t %>%
  # 生成MCV分组区间
  mutate(MCV_bin = cut(MCV, breaks = seq(floor(min(MCV)/5)*5, ceiling(max(MCV)/5)*5, by = 5))) %>%
  group_by(MCV_bin) %>%
  summarise(
    mortality_ratio = sum(mortality == 1) / n() * 100,
    # 提取区间中点作为x轴显示值
    MCV_mid = as.numeric(sub("\\((.*),(.*)\\]", "\\1.5", MCV_bin))
  )

# 绘制图形
ggplot(processed_data, aes(x = MCV_mid, y = mortality_ratio)) +
  geom_col(width = 5) + # 宽度匹配binwidth
  xlab("MCV") +
  ylab("Mortality = 1 占比 (%)") +
  scale_x_continuous(breaks = unique(t$MCV)) # 自定义x轴刻度

方法2:直接在ggplot中计算占比(无需额外预处理)

利用stat_bin的after_stat函数,在绘图时直接计算每个区间的死亡占比:

library(ggplot2)

ggplot(t, aes(x = MCV)) +
  stat_bin(
    aes(y = after_stat(
      # 提取mortality=1的计数,除以当前区间总计数,转百分比
      count[group == 2] / sum(count[group == 1] + count[group == 2]) * 100
    )),
    binwidth = 5,
    geom = "bar"
  ) +
  xlab("MCV") +
  ylab("Mortality = 1 占比 (%)")

关键说明

  • 原代码的问题在于sum(..count..)计算的是全局总计数,而非当前MCV区间的总计数,导致y轴显示的是全局占比而非区间占比;
  • 方法2中group的索引需注意:当ggplot按mortality分组时,group==1对应mortality=0,group==2对应mortality=1,若你的数据因子顺序不同,需调整索引。

内容的提问来源于stack exchange,提问作者HH Chang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:48:25