R ggplot2绘制联赛国家比赛数与黄牌数并列柱状图
R 实现联赛国家维度并列柱状图方案
核心实现逻辑
要完成同x轴分类下两个指标的并列柱形展示,需要先完成数据聚合、格式转换,再匹配ggplot2的分组绘图规则,核心流程如下:
- 按
leagueCountry字段分组,分别计算games、yellowCards的累计总和 - 将聚合后的宽表转为长表,把两个指标的名称、数值分别存入两列,满足ggplot2的映射要求
- 绘图时将指标类型映射给填充色
fill,搭配position = "dodge"实现同组柱体并列
完整可运行代码
# 加载所需工具包 library(dplyr) library(tidyr) library(ggplot2) # 数据预处理 plot_df <- new_soccer_referee %>% # 按联赛国家分组汇总 group_by(leagueCountry) %>% summarise( total_games = sum(games, na.rm = TRUE), total_yellow = sum(yellowCards, na.rm = TRUE), .groups = "drop" ) %>% # 转换为ggplot适配的长格式 pivot_longer( cols = c(total_games, total_yellow), names_to = "metric", values_to = "value" ) # 绘制并列柱状图 ggplot(plot_df, aes(x = leagueCountry, y = value, fill = metric)) + geom_col( position = position_dodge(width = 0.8), width = 0.7 ) + # 可选:给柱体添加数值标签 geom_text( aes(label = value), position = position_dodge(width = 0.8), vjust = -0.2, size = 3 ) + # 自定义坐标轴和图例文本 scale_fill_discrete( labels = c("累计比赛场次", "累计黄牌数") ) + labs( x = "联赛所属国家", y = "累计数值", fill = "统计指标", title = "各国联赛累计场次与黄牌数对比" ) + theme_bw()
常见踩坑说明
- 很多人写
geom_col(position="dodge")出问题,核心原因是没有在aes()里给分组维度(这里是指标类型)做映射,ggplot无法识别分组规则,就会出现柱体堆叠、位置错位的问题 pivot_longer转换长格式是分组绘图的核心步骤,如果直接在原始宽表上给两个指标分别加geom_col层,会出现柱体重叠、图例无法自动生成的问题position_dodge(width=...)的数值要和geom_col的width参数匹配,一般dodge宽度比柱宽大0.1左右,能保证同组柱体相邻、组间有明显间距- 汇总时记得加
na.rm=TRUE,避免原始数据存在缺失值导致汇总结果为NA
内容的提问来源于stack exchange,提问作者Tianna
相关产品推荐
相关产品推荐

