You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ggplot2实现按年份与学生数排序的分组条形图

解决按年份和学生数排序的柱状图可视化问题

我懂你想要的效果——每个年份下的班级柱子要按学生数(Students)排序,但当前图表里班级是默认按字母顺序排列的,这就是没达到预期的核心原因。下面给你一步步拆解解决方法:

步骤1:调整数据的因子顺序

ggplot会遵循因子的水平顺序来排列元素,所以我们需要给Classroom列设置「基于每个年份学生数」的排序规则。用dplyr+forcats就能轻松搞定:

# 先加载必备包
library(ggplot2)
library(dplyr)
library(forcats)

# 你的原始数据
graphos <- data.frame(
  Year = c(2007,2007,2007,2008,2008,2008,2009,2009,2009),
  Classroom = c("A","B","C","A","E","B","D","B","A"),
  Students = c(52080,49426,42522,53124,50784,45920,55971,52216,49850)
)

# 按Year分组,给每个年份下的Classroom按Students降序设置因子水平
graphos_sorted <- graphos %>%
  group_by(Year) %>%
  mutate(Classroom = fct_reorder(Classroom, -Students)) # 负号代表降序,去掉就是升序

步骤2:用排序后的数据绘图

现在用处理好的graphos_sorted生成图表,每个年份下的班级就会自动按学生数从高到低排列了:

graph2 <- ggplot(graphos_sorted, aes(fill=Classroom, y=Students, x=Year)) +
  geom_bar(position="dodge", stat="identity", color='black')
graph2

额外小提示

  • 如果想要升序排列(学生数少的班级在前),只需要把fct_reorder里的-Students改成Students就行。
  • fct_reorder是forcats包的工具,专门用来调整因子顺序,对付这种「分组内排序」的场景特别顺手。

这样修改后,你就能得到完全符合预期的排序可视化结果啦!

内容的提问来源于stack exchange,提问作者Francesc Pons Álvarez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:18:58