ggplot分组柱状图(position=dodge)比例标签错位问题咨询
解决ggplot因子分组下标签错位问题
问题根源
当把variable设为因子后,geom_bar通过fill=variable实现分组,但你写的geom_text没在aes里指定fill=variable(或group=variable),导致文本的分组逻辑和柱子不匹配,自然就错位了。
修复代码
只需要给geom_text的aes加上fill=variable(或者group=variable),让文本和柱子用同样的分组规则,position_dodge2就能把标签对应到正确的柱子上:
ggplot(df,aes(x=lake,y=harv))+ geom_bar(aes(fill=variable),stat="identity",position = position_dodge2(width=0.9))+ geom_text(size=7,aes(x=lake, y=harv, label = paste0(round(prop2,digits = 2),"%"), fill=variable, vjust=-0.5), position = position_dodge2(width=0.9))
用group=variable替代fill=variable也能达到同样效果:
ggplot(df,aes(x=lake,y=harv))+ geom_bar(aes(fill=variable),stat="identity",position = position_dodge2(width=0.9))+ geom_text(size=7,aes(x=lake, y=harv, label = paste0(round(prop2,digits = 2),"%"), group=variable, vjust=-0.5), position = position_dodge2(width=0.9))
为什么这样有效
position_dodge2是依据aes里的分组变量来分配位置的。之前geom_text没指定分组,默认只按lake分组,所有标签都挤在lake的中心位置;加上分组变量后,文本会和柱子对应到同一组,位置自然就对齐了,同时还能保留你设置的因子柱子顺序。
内容的提问来源于stack exchange,提问作者David Smith
相关产品推荐
相关产品推荐

