ggplot绘制条形图时reorder函数无法正确实现降序排序问题
ggplot2 条形图reorder排序异常原因及修复
异常根因
排序结果不符合预期的核心是排序用的统计规则和柱高计算规则不匹配:
- 绘图代码中
geom_bar(stat = "identity", fun.y = sum)的计算逻辑是:每个省份对应的柱高,为该省份下所有gross_profit记录的总和 reorder(province,-gross_profit)的默认聚合逻辑是:按每个省份下gross_profit的均值重排因子水平,而非按总和排序
当单个省份对应多条利润观测记录时,按均值排序和按总和排序的结果大概率存在差异,最终就会出现「顺序发生了变化,但没有按照总利润从高到低降序排列」的异常。
修复方法
直接在reorder()函数里明确指定聚合函数为sum,让排序逻辑和柱高计算逻辑完全对齐即可:
ggplot(df, aes(x = reorder(province, -gross_profit, FUN = sum), y = gross_profit)) + geom_bar(stat = "identity", fun.y = sum) + labs(title="Profit by Province", x = "Province")
更稳妥的推荐写法
为了避免不同图层的统计逻辑不一致导致的显示问题,推荐先提前完成数据聚合,再传入ggplot绘图,新版ggplot2中可以直接用geom_col()代替stat="identity"的geom_bar(),代码可读性更高:
library(dplyr) # 先按省份聚合计算总利润 df_agg <- df %>% group_by(province) %>% summarise(total_gross_profit = sum(gross_profit), .groups = "drop") # 直接用聚合后的数据绘图,排序逻辑更清晰 ggplot(df_agg, aes(x = reorder(province, -total_gross_profit), y = total_gross_profit)) + geom_col(fill = "steelblue") + labs( title = "Profit by Province", x = "Province", y = "Total Gross Profit" )
内容的提问来源于stack exchange,提问作者GatorAdmiral03
相关产品推荐
相关产品推荐

