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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:15:37