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

如何在ggplot2中为GPA最高的三个条形分别设置金、银、铜配色,其余条形设为蓝色?

解决GPA排名条形图的配色问题

我来帮你搞定这个困扰!你遇到的问题核心是:原来的代码是按Name的字母顺序分配颜色,但我们需要的是按GPA高低排名来给前三名分配金、银、铜色。下面是具体的解决方案:

思路梳理

与其直接给Name因子分配颜色(会受字母顺序影响),不如先处理数据,给GPA排名前三的学生打上专属标签,再用这个标签来映射填充色——这样不管学生数量多少,都能精准对应排名。

完整代码示例

library(dplyr)
library(ggplot2)

# 第一步:计算GPA并添加排名标签
student_gpa <- subjects_long %>%
  group_by(Name) %>%
  summarize(gpa = mean(grade), .groups = "drop") %>% # 计算每个学生的GPA
  arrange(desc(gpa)) %>% # 按GPA从高到低排序
  mutate(
    # 给前三名标记金、银、铜,其余标记为"其他"
    medal_group = case_when(
      row_number() == 1 ~ "Gold",
      row_number() == 2 ~ "Silver",
      row_number() == 3 ~ "Bronze",
      TRUE ~ "Other"
    )
  )

# 第二步:绘制条形图
ggplot(student_gpa, aes(x = reorder(Name, -gpa), y = gpa, fill = medal_group)) +
  geom_col() +
  coord_flip() +
  scale_y_continuous(breaks = seq(0, 5, by = 0.1)) +
  scale_fill_manual(
    # 按标签对应颜色
    values = c(
      "Gold" = "#d6af36",
      "Silver" = "#d7d7d7",
      "Bronze" = "#a77044",
      "Other" = "blue"
    ),
    # 可选:自定义图例显示的文字
    labels = c("GPA第1名", "GPA第2名", "GPA第3名", "其他学生")
  ) +
  # 可选:修改图表标题、图例标题等
  labs(
    title = "学生GPA排名条形图",
    x = "学生姓名",
    y = "平均GPA",
    fill = "GPA排名"
  )

关键改进点

  1. 数据预处理:用arrange(desc(gpa))按GPA降序排序,再用row_number()精准定位前三名,彻底避免了字母顺序的干扰。
  2. 填充色映射:用新的medal_group变量代替Name来映射填充色,颜色分配逻辑更清晰,也不需要手动计算学生数量来生成颜色向量。
  3. 灵活性:不管你的班级数据集有多少学生,这份代码都能自动识别GPA最高的三个,并正确配色。

内容的提问来源于stack exchange,提问作者Bálint L. Tóth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:02:47