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

如何基于子组最大值对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:42:42