为何position_dodge()会改变ggplot图表的总数值?
问题:position_dodge()为何改变柱状图的Abundance数值?
为何在代码中保留position=position_dodge()时,图表的总Abundance数值会全部改变?移除该参数后总数值恢复正确,position_dodge()为何会影响数值结果?
附代码如下:
ggplot(data=check, aes(y=Abundance, x=Urban.Intensity)) + geom_bar(stat="identity", position=position_dodge()) + theme_bw() + facet_wrap(~Genus, ncol=2) + scale_y_continuous(limits=c(0,1500)) + theme(text = element_text(size=14), axis.title.x = element_text(size=14, color="black"), axis.title.y = element_text(size=14, color="black"), axis.text.x = element_text(size=14, color="black"), axis.text.y = element_text(size=14, color="black"), strip.text = element_text(face="italic", size=12, color="black")) + ylab("Abundance") + xlab("Urbanization Intensity")
现象:含position_dodge()的图表总Abundance数值不正确;不含该参数的图表总数值正确。
解答
position_dodge()的核心作用是将同一x轴分组下的元素横向错开,它的生效逻辑依赖于你在aes()中指定了分组映射(比如fill或color绑定到某个分类变量)。- 当你没有设置分组映射却强行添加
position_dodge()时,ggplot会默认把数据中的每一行都视为独立分组。这就导致同一Urban.Intensity类别下的多条数据被拆分成多个横向错开的柱子,每个柱子的高度只是单条数据的Abundance值,而非该类别下的总和——视觉上就表现为“总数值不对”。 - 移除
position_dodge()后,ggplot默认会对同一x轴位置下的所有数据进行叠加合并(如果你的数据是未汇总的原始数据),或者直接显示汇总后的单个柱子(如果数据已经做过分组求和),此时你看到的就是正确的总Abundance数值。
总结:未指定分组变量时使用position_dodge()会错误拆分同x类别下的数据条目,导致显示单个值而非总和;去掉该参数后,同类别数据被正确合并,显示总数值。
内容的提问来源于stack exchange,提问作者Katherine Chau
相关产品推荐
相关产品推荐

