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

如何在ggplot中按指定组数值排序条形图并匹配图例顺序?

解决条形图排序与图例顺序问题

问题分析

原代码使用reorder(Category, value)是基于所有分组的数值排序,无法精准按指定的Teacher组数值降序排列;同时图例默认按变量字母顺序展示,无法匹配顶部条形的标签优先级。

解决方案代码

library(reshape2)
library(ggplot2)

df <- data.frame(Category = c("A","B", "C", "D", "E", "F"), 
                 Student = c(4.4,3.35,5.96,2.07,4.56,3.55), 
                 Teacher = c(3.21,4.39,5.3,1.8,2.8,3.14))

# 1. 按Teacher组数值降序获取Category的排序顺序
sorted_cats <- df$Category[order(-df$Teacher)]

# 2. 转换长格式并固定Category的因子顺序
data.m <- melt(df, id.vars='Category')
data.m$Category <- factor(data.m$Category, levels = sorted_cats)

# 3. 调整图例顺序:让顶部条形对应的Student标签排在最前
data.m$variable <- factor(data.m$variable, levels = c("Student", "Teacher"))

ggplot(data.m, aes(y = Category, x = value)) +
  geom_col(aes(fill = variable),
           position = position_dodge(width = 0.6), width = .6
  ) +
  geom_text(aes(label = value, group = variable),
            hjust = -0.2, size = 2.5,
            position = position_dodge(width = 0.6)
  ) +
  scale_x_continuous(expand = c(0, 0, .05, 0)) +
  scale_fill_brewer(palette = "Blues", breaks = c("Student", "Teacher")) +
  theme_classic() +
  labs(title = "Students and Teachers", x = "Means", y = "Category", fill = NULL)

关键修改说明

  • 按Teacher组排序:直接从原始宽格式数据中提取Teacher列数值,用order(-df$Teacher)生成降序的Category序列,再将data.m$Category转换为指定层级的因子,确保y轴顺序固定且符合需求。
  • 图例顺序调整:将variable列转换为因子,把顶部条形对应的Student设为第一个层级,同时在scale_fill_brewer中指定breaks参数,保证图例顶部显示该标签。

内容的提问来源于stack exchange,提问作者minervax29

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:22:30