使用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
相关产品推荐
相关产品推荐

