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

R语言绘制分组百分比条形图异常,请求协助解决

按年龄、性别分组的策略百分比条形图解决方案

你的代码问题在于:默认的geom_bar()会统计原始观测数量(stat="count"),而scale_y_continuous(labels=percent_format())只是把计数数值转换成百分比格式的文本,并没有将数值按子组(年龄+性别)归一化到100%。比如子组只有4个观测时,就会显示4%而非100%的占比分布。

下面提供两种解决方法:

方法一:使用position="fill"快速实现

通过position="fill"让每个条形的高度自动归一到1(即100%),再将Y轴标签转为百分比格式:

rf <- ggplot(data = data2) +
  geom_bar(
    mapping = aes(x = age, fill = strategy),
    position = position_fill(),  # 使每个条形高度总和为1
    colour = "black"
  ) +
  scale_y_continuous(labels = percent_format()) +  # 将1转换为100%显示
  facet_grid(~gender, labeller = labeller(gender = saud_gender_names)) +
  scale_fill_manual(values = cbPalette) +
  theme_bw() + 
  scale_x_discrete(labels = c("younger", "older")) +
  ggtitle("Contour Choice in YNQS")

rf

注:移除了labeller中的task = saud_task_names,因为你的分面公式里没有task变量。

方法二:预先计算百分比(更可控)

如果你需要明确控制百分比的计算逻辑(比如验证数值正确性),可以用dplyr先按年龄和性别分组计算各策略的占比,再用geom_col()绘图:

首先加载dplyr包(如果未加载):

library(dplyr)

计算百分比:

percent_data <- data2 %>%
  group_by(age, gender) %>%
  count(strategy) %>%
  mutate(percentage = n / sum(n) * 100)  # 按年龄+性别组计算百分比

绘图:

rf <- ggplot(data = percent_data) +
  geom_col(
    mapping = aes(x = age, y = percentage, fill = strategy),
    position = position_dodge(width = 0.9),  # 条形并排显示
    colour = "black"
  ) +
  scale_y_continuous(labels = percent_format()) +
  facet_grid(~gender, labeller = labeller(gender = saud_gender_names)) +
  scale_fill_manual(values = cbPalette) +
  theme_bw() + 
  scale_x_discrete(labels = c("younger", "older")) +
  ggtitle("Contour Choice in YNQS")

rf

这种方法可以先查看percent_data数据框,确认百分比计算正确后再绘图。

原代码失效原因

  • geom_bar()默认统计原始行数(stat="count"),Y轴数值是计数而非占比。
  • scale_y_continuous(labels=percent_format())仅改变数值的显示格式(比如把4变成"4%"),并未将数值按子组归一化为百分比。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:35:28