为何ggplot2柱状图数据与数据标签不匹配?(代码对比)
柱状图数据标签与实际高度颠倒的原因分析
在第一段R代码绘制的柱状图中,1月、2月、10月、11月出现了member与casual骑行次数的实际柱状高度和数据标签颠倒的问题(实际member骑行次数更多,但标签显示相反):
trips_2021 %>% ggplot(aes(x=factor(ride_month), fill = member_casual)) + geom_bar()+ #using factor() to display all x values scale_y_continuous(labels= comma) + geom_text(stat = "count", aes(label = ..count..), size = 2)+ theme(axis.text.x = element_text(angle = 90))+ labs(title='Count of bike rides by months in 2021', x= 'Month of ride', y = 'Count of rides')
而给geom_bar和geom_text都添加position='fill'参数后,数据标签与实际数据匹配:
trips_2021 %>% ggplot(aes(x=factor(ride_month), fill = member_casual)) + geom_bar(position = 'fill')+ #using factor() to display all x values scale_y_continuous(labels= comma) + geom_text(stat = "count", aes(label = ..count..), size = 2, position = 'fill')+ theme(axis.text.x = element_text(angle = 90))+ labs(title='Count of bike rides by months in 2021', x= 'Month of ride', y = 'Count of rides')
原因解释
问题的核心是**geom_text和geom_bar的位置规则不统一**:
- 第一段代码中,
geom_bar默认使用position="stack"(堆叠模式),会把member_casual两个分组的柱子按因子水平顺序堆叠(比如先放casual的柱子,再在上面叠member的柱子)。 - 但
geom_text默认用的是position="identity"(独立定位),也就是直接把标签画在每个分组原始计数对应的y轴位置上,没有跟随堆叠后的柱子位置调整。当某个月份member的计数远大于casual时,casual的标签会被压在member柱子的下方,而member的标签会出现在总骑行次数的高度位置,视觉上就造成了标签和柱子对应颠倒的错觉。 - 第二段代码中,
geom_bar和geom_text都指定了position='fill',两者的位置计算规则完全统一,标签会精准对应各自分组的填充区域,因此不会出现错位。
如果要在堆叠柱状图里让标签正确匹配,只需要给geom_text加上position=position_stack(vjust=0.5),让标签跟随堆叠的柱子位置居中显示即可。
内容的提问来源于stack exchange,提问作者Atul Pandey
相关产品推荐
相关产品推荐

