如何制作百分比堆积条形图展示不同DataFrame中足球统计数据的比例关系?
解决方案:制作足球统计指标的百分比堆积条形图
数据整理步骤
首先需要将两个宽格式的DataFrame转换为适合ggplot绘图的长格式,并计算对应分组的百分比。这里分两种匹配你需求的场景处理:
场景1:按主客场分组,展示每组内各指标的占比
x轴为home/away,每个条形内堆积各指标(GS/GC/TP/GD)的百分比:
library(tidyverse) # 构造原始数据 home <- data.frame( HTGS = 35.7923977, HTGC = 19.0087719, HTP = 1.7241305, HTGD = 0.8221233 ) away <- data.frame( ATGS = 35.9736842, ATGC = 18.9444444, ATP = 1.7564932, ATGD = 0.8349917 ) # 数据清洗与转换 home_tidy <- home %>% mutate(group = "home") %>% rename_with(~ str_remove(., "HT")) %>% pivot_longer(-group, names_to = "metric", values_to = "value") away_tidy <- away %>% mutate(group = "away") %>% rename_with(~ str_remove(., "AT")) %>% pivot_longer(-group, names_to = "metric", values_to = "value") # 合并并计算组内百分比 combined_data <- bind_rows(home_tidy, away_tidy) %>% group_by(group) %>% mutate(percentage = value / sum(value) * 100) %>% ungroup() # 绘制百分比堆积条形图 ggplot(combined_data, aes(x = group, y = percentage, fill = metric)) + geom_col(position = "stack") + # 添加百分比标签,居中显示 geom_text(aes(label = sprintf("%.1f%%", percentage)), position = position_stack(vjust = 0.5), size = 3) + labs( x = "主/客场", y = "百分比", title = "主客场各统计指标占比分布", fill = "统计指标" ) + theme_minimal()
场景2:按统计指标分组,展示每个指标内主客场的占比
x轴为各指标(GS/GC/TP/GD),每个条形内堆积home/away的百分比(即你需要的「每个条形展示不同DataFrame的两组数据比例关系」):
只需调整百分比的计算逻辑,按指标分组计算主客场的占比:
# 合并并计算指标内百分比 combined_data_alt <- bind_rows(home_tidy, away_tidy) %>% group_by(metric) %>% mutate(percentage = value / sum(value) * 100) %>% ungroup() # 绘制图表 ggplot(combined_data_alt, aes(x = metric, y = percentage, fill = group)) + geom_col(position = "stack") + geom_text(aes(label = sprintf("%.1f%%", percentage)), position = position_stack(vjust = 0.5), size = 3) + labs( x = "统计指标", y = "百分比", title = "各统计指标主客场占比分布", fill = "主/客场" ) + theme_minimal()
关键说明
- 使用
pivot_longer将宽格式数据转为长格式是ggplot绘制分组图表的核心前提 - 通过
group_by+mutate计算百分比,可灵活控制按主客场或按指标分组计算比例 position = "stack"指定堆积模式,配合position_stack(vjust = 0.5)让标签居中显示
内容的提问来源于stack exchange,提问作者Simon Fox Kuuse
相关产品推荐
相关产品推荐

