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

如何在R中复现随年份排名变动的热力图并自定义样式?

解决方案:动态排名热力图(球队名填充+专属颜色)

要实现随年份调整类别排名、单元格显示球队名且每个球队有专属填充色的热力图,ggplot2比tidyheatmaps更灵活,以下是具体实现步骤:

1. 数据预处理:生成年度排名

先构造或导入你的球队胜场数据,按年份分组计算每支球队的年度排名,这样y轴就用动态的排名位置,而非固定球队名称。

library(tidyverse)

# 示例:构造5支球队2018-2022年的胜场数据
set.seed(123)
team_data <- expand.grid(
  year = 2018:2022,
  team = c("红雀队", "道奇队", "洋基队", "小熊队", "巨人队")
) %>%
  mutate(wins = sample(70:100, n(), replace = TRUE)) %>%
  # 按年份分组,对胜场降序排名(dense_rank避免并列排名跳号)
  group_by(year) %>%
  mutate(rank = dense_rank(desc(wins))) %>%
  ungroup()

2. 定义球队专属颜色

为每支球队分配固定颜色,确保无论排名如何变化,颜色始终对应球队:

team_colors <- c(
  "红雀队" = "#C41E3A",
  "道奇队" = "#005A9C",
  "洋基队" = "#003057",
  "小熊队" = "#0E3386",
  "巨人队" = "#FD5A1E"
)

3. 绘制动态排名热力图

用geom_tile绘制热力单元格,geom_text添加球队名称,通过y轴的排名实现位置动态调整:

ggplot(team_data, aes(x = factor(year), y = rank)) +
  # 热力单元格:填充色绑定球队
  geom_tile(aes(fill = team), color = "white", size = 1) +
  # 单元格内显示球队名称
  geom_text(aes(label = team), color = "white", fontface = "bold") +
  # 应用球队专属颜色映射
  scale_fill_manual(values = team_colors) +
  # 反转y轴:让排名1(第一)显示在最上方
  scale_y_reverse(breaks = 1:max(team_data$rank)) +
  # 调整主题与标签
  theme_minimal() +
  labs(
    x = "年份",
    y = "年度排名",
    title = "MLB球队年度胜场排名热力图",
    fill = "球队"
  ) +
  theme(
    axis.text = element_text(size = 12),
    plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
    legend.position = "bottom"
  )

关键说明

  • y轴使用年度排名而非固定球队,因此每年的球队位置会随胜场排名动态变化;
  • scale_y_reverse确保排名第一的球队显示在热力图最上方,符合常规排名的视觉习惯;
  • 填充色与球队绑定,无论排名如何变动,同一球队的颜色始终一致;
  • 单元格内直接显示球队名称,替代原有的数字值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:26:09