R语言ggplot2绘制计数柱状图如何按计数降序重排x轴
实现方案
完全可以用reorder()类函数实现需求,不需要提前在原始数据集中手动计算计数字段,两种常用实现方式如下:
方案1:直接在ggplot映射中重排因子,不修改原始数据
不需要提前聚合数据,reorder()会自动按分组计算观测数(和geom_bar默认统计的计数完全一致),直接修改aes()里的x映射即可:
mpg %>% ggplot2::ggplot(ggplot2::aes(x = reorder(class, class, FUN = length, decreasing = TRUE))) + ggplot2::geom_bar(fill = '#00798c') + ggplot2::geom_text(stat = "count", ggplot2::aes(label = after_stat(count)), position = ggplot2::position_dodge(width = 0.8), vjust = -0.3) + ggplot2::labs(x = "class") # 修正x轴标题,避免显示reorder函数的长文本
核心参数说明:
FUN = length:对每个class分组计算样本量,得到的结果就是柱状图的高度decreasing = TRUE:按计数降序排列,设为FALSE即为升序
方案2:提前聚合数据后重排因子,逻辑更直观
如果觉得直接在映射里写函数不够清晰,可以先用dplyr统计计数,再用forcats包的因子重排函数调整顺序,这时候用geom_col()绘制柱状图即可(因为已经有明确的y轴数值,不需要stat = "count"做默认统计):
library(dplyr) library(forcats) mpg %>% count(class, name = "count") %>% # 提前统计每个class的计数 mutate(class = fct_reorder(class, count, .desc = TRUE)) %>% # 按计数降序重排因子水平 ggplot2::ggplot(aes(x = class, y = count)) + ggplot2::geom_col(fill = '#00798c') + ggplot2::geom_text(aes(label = count), vjust = -0.3)
这种方式不需要额外调整轴标题,后续如果要给柱子加分组、调整标签映射也更灵活。
内容的提问来源于stack exchange,提问作者Eisen
相关产品推荐
相关产品推荐

