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

