如何用ggplot2绘制西甲赛事对阵结果表格并实现自定义样式?
实现西甲球队交锋结果对阵表(奇偶行着色+Tile内嵌球队名)
看起来你已经有了基础的geom_tile代码,那我们来一步步调整到你想要的效果——奇偶行区分颜色,同时把球队名嵌入Tile内,最终做出类似对阵表的可视化。
首先,我会用模拟数据来演示,你可以直接替换成自己的西甲赛事DataFrame:
1. 准备模拟数据(替换成你的真实数据)
假设你的数据包含home_team(主队)、away_team(客队)和result(比赛结果,比如"2-1"):
library(tidyverse) # 模拟西甲球队和比赛数据 set.seed(123) teams <- c("Barcelona", "Real Madrid", "Atletico Madrid", "Valencia", "Sevilla", "Real Sociedad") matches <- expand.grid(home_team = teams, away_team = teams) %>% filter(home_team != away_team) %>% # 排除同队对阵 mutate(result = paste(sample(0:3, nrow(.), replace = TRUE), sample(0:3, nrow(.), replace = TRUE), sep = "-"))
2. 标记奇偶行并设置颜色
我们先给每支球队的行分配行号,然后根据奇偶性设置填充色(奇数行白色,偶数行浅蓝色):
# 给球队排序并添加行号与颜色标记 team_metadata <- tibble(team = teams, row_num = 1:length(teams)) %>% mutate(tile_color = ifelse(row_num %% 2 == 1, "white", "#a6c9ff"))
3. 构建包含球队标题的完整数据集
为了把球队名嵌入Tile内,我们需要额外添加行标题(每行第一个Tile显示主队名称)和列标题(每列第一个Tile显示客队名称):
# 行标题数据:每行第一个Tile显示主队名 row_headers <- team_metadata %>% mutate(home_team = team, away_team = "Team", result = team) # 列标题数据:每列第一个Tile显示客队名 col_headers <- team_metadata %>% mutate(home_team = "Team", away_team = team, result = team, row_num = 0, tile_color = "white") # 合并比赛数据与标题数据 full_data <- matches %>% left_join(team_metadata, by = c("home_team" = "team")) %>% bind_rows(row_headers, col_headers) %>% arrange(row_num, home_team) # 按行号排序,确保标题行在最上方
4. 绘制最终可视化
现在用ggplot2绘制,重点是用tile_color控制填充,同时把结果/球队名嵌入Tile:
ggplot(full_data, aes(x = away_team, y = fct_inorder(home_team))) + # 绘制Tile,用奇偶行颜色填充 geom_tile(aes(fill = tile_color), color = "black", size = 0.5) + # 直接使用我们定义的颜色,不做自动映射 scale_fill_identity() + # 添加Tile内的文本(球队名或比赛结果) geom_text(aes(label = result), size = 4, color = "#333333") + # 隐藏默认轴标签、刻度,让可视化更像表格 theme( axis.text = element_blank(), axis.title = element_blank(), axis.ticks = element_blank(), panel.background = element_blank(), plot.margin = margin(10, 10, 10, 10) )
关键细节说明
fct_inorder(home_team)确保球队行的顺序和我们定义的team_metadata一致,保证奇偶行颜色正确。- 如果你的真实数据里,每对球队有主客场两场比赛,可以先聚合结果(比如用
paste合并两次结果),再进行可视化。 - 你可以调整
tile_color的蓝色值(比如#a6c9ff)来匹配你想要的深浅。
这样就能得到奇偶行颜色区分、Tile内嵌球队名和比赛结果的对阵表啦!
内容的提问来源于stack exchange,提问作者A.A.
相关产品推荐
相关产品推荐

