如何基于子组最大值对ggplot分组条形图的组进行排序?
按特定子组数值排序分组条形图的x轴类别
要实现按特定音乐流派的listens值对x轴的person进行排序,核心是先给person设置基于目标子组数值的因子水平,再用处理后的数据集绘图。以下是具体步骤:
1. 处理数据,设置排序后的因子水平
假设我们要按pop流派的listens值排序person,可以用以下代码:
library(tidyverse) set.seed(3) df <- data.frame(person = c("John", "Sarah", "Alex", "Kate", "Oliver", "Emily", "Daniel"), music_genre = rep(c("pop", "classical", "rap"), each = 7), listens = sample(40:90, size = 21, replace = TRUE)) # 提取目标流派(比如pop)的数据,按listens排序后得到person的顺序 sorted_persons <- df %>% filter(music_genre == "pop") %>% # 替换成你需要的流派,比如"classical"或"rap" arrange(listens) %>% # 从小到大排序,加desc()就是从大到小:arrange(desc(listens)) pull(person) # 将原数据的person转换成因子,水平为排序后的顺序 df_sorted <- df %>% mutate(person = factor(person, levels = sorted_persons))
2. 绘制排序后的分组条形图
用处理好的df_sorted绘图,x轴的person会按目标子组的数值排序,同时保留所有流派的条形:
ggplot(data=df_sorted) + geom_bar(aes(x=person, y=listens, fill=music_genre), stat="identity", position="dodge")
额外说明
- 切换排序依据的流派:只需要修改
filter(music_genre == "pop")里的流派名称即可。 - 调整排序方向:把
arrange(listens)改成arrange(desc(listens)),就能实现从大到小排序。
内容的提问来源于stack exchange,提问作者degeso
相关产品推荐
相关产品推荐

