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

