在ggplot2中绘制按舱位-性别分组的存活率百分比柱状图
解决方案
要实现每个(舱位-性别)分组的存活率百分比柱状图,有两种常用方法,以下是具体实现:
方法1:先分组计算存活率,再绘图
这种方式逻辑清晰,先通过数据预处理得到每个分组的存活率,再用ggplot绘制柱状图:
# 计算每个(Pclass, Sex)分组的存活率 survival_rates <- titanic %>% group_by(Pclass, Sex) %>% summarize(survival_pct = mean(Survived == "1") * 100, .groups = "drop") # 绘制并列柱状图 survival_rates %>% ggplot(aes(x = Pclass, y = survival_pct, fill = Sex)) + geom_col(position = position_dodge(width = 0.9)) + labs(y = "存活率(%)", title = "不同舱位与性别的存活率") + theme_minimal()
- 说明:
group_by(Pclass, Sex)按舱位和性别分组;mean(Survived == "1")计算分组内存活比例(逻辑值TRUE对应1、FALSE对应0,均值即为存活占比),乘以100转为百分比;.groups = "drop"用于取消分组状态,避免后续绘图出现警告。
方法2:直接在ggplot中计算并绘图
如果不想提前预处理数据,可以直接在ggplot中通过内置统计函数实现:
用stat_summary实现
titanic %>% ggplot(aes(x = Pclass, fill = Sex)) + stat_summary( aes(y = as.numeric(Survived) - 1), fun = function(x) mean(x) * 100, geom = "col", position = position_dodge(width = 0.9) ) + labs(y = "存活率(%)", title = "不同舱位与性别的存活率") + theme_minimal()
用geom_bar调整参数实现
titanic %>% ggplot(aes(x = Pclass, fill = Sex)) + geom_bar( aes(y = (after_stat(prop)) * 100), stat = "count", position = position_dodge(width = 0.9), aes(weight = as.numeric(Survived) - 1) ) + labs(y = "存活率(%)", title = "不同舱位与性别的存活率") + theme_minimal()
- 说明:
as.numeric(Survived) - 1将因子类型的Survived("0"和"1")转为数值0和1;通过fun = mean或weight参数,让ggplot基于分组内数据计算存活比例,再转为百分比。
你之前的方法无效的原因
你使用titanic$Survived调用的是整个数据集的Survived列,而非当前分组内的子集,因此计算的是总存活数与分组人数的比值,而非分组内的存活率。上述方法均基于分组内数据计算,能得到正确结果。
内容的提问来源于stack exchange,提问作者Noflik
相关产品推荐
相关产品推荐

