如何在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
相关产品推荐
相关产品推荐

