如何在ggplot中仅绘制变量单一变体的百分比
解决方案
问题核心是你搞反了计算百分比和过滤数据的顺序:如果先过滤出Round再计算占比,每个发音方式(Manner)分组里只剩Round这一类,自然会显示100%;你需要先基于完整数据算出Round在对应Manner中的占比,再过滤出Round的数据绘图。
具体步骤(用dplyr+ggplot2实现)
假设你的原始数据是response_data,包含列:Manner(发音方式)、Shape(形状)、Count(响应计数)(如果是原始响应数据,每个行对应一个参与者的选择,代码会稍有不同)。
先计算各发音方式下的相对百分比
基于完整数据,按Manner分组,计算每个Shape的占比:library(dplyr) library(ggplot2) # 处理汇总计数数据的情况 calculated_data <- response_data %>% group_by(Manner) %>% # 计算每个Shape在对应Manner中的百分比 mutate(Percentage = Count / sum(Count) * 100) %>% ungroup() # 如果是原始响应数据(每行是一个参与者的选择),用这段代码计算 # calculated_data <- response_data %>% # group_by(Manner, Shape) %>% # summarise(Count = n(), .groups = "drop") %>% # group_by(Manner) %>% # mutate(Percentage = Count / sum(Count) * 100) %>% # ungroup()过滤出Round形状的数据
这一步再筛选出你需要的Round行,此时Percentage是基于原分组的正确占比:round_only_data <- calculated_data %>% filter(Shape == "Round")绘制分面柱状图(保留原有结构)
用过滤后的数据集绘图,就能得到正确的Round占比,且只显示Round的柱形:ggplot(round_only_data, aes(x = Manner, y = Percentage)) + geom_col(fill = "#619CFF") + # 可自定义颜色 facet_wrap(~Manner, scales = "free_x") + # 保持原有分面布局 labs(x = "发音方式", y = "Round形状响应百分比")
为什么之前的方法不行?
当你先filter(Shape == "Round")再计算百分比时,group_by(Manner)后每个分组里只有Round这一个类别,sum(Count)就是Round的计数本身,所以Count/sum(Count)结果为1(即100%),这不是你需要的基于原完整分组的相对频率。
内容的提问来源于stack exchange,提问作者thelazyastronut
相关产品推荐
相关产品推荐

