如何在R中合并两个进球频率向量为数据框以绘制并列柱状图
主客场进球频率并列柱状图实现方案
实现思路
ggplot2默认适配长表结构,宽表无法适配的核心原因是缺少单独的队伍分组列,最优方案是将数据转换为「进球数-队伍类型-频率」的长格式,无需手动合并补NA,流程更简洁不易出错。
完整实现代码
方案1:从原始进球向量直接处理(推荐)
不需要提前调用table()统计和手动合并,直接用tidyverse套件完成全流程:
# 加载依赖包 library(ggplot2) library(dplyr) library(tidyr) # 模拟原始进球向量,实际使用时替换为自有向量即可 set.seed(123) home_goals <- rpois(100000, lambda = 1.5) away_goals <- rpois(100000, lambda = 1.2) # 一步完成长格式转换+频率统计 plot_data <- tibble( 主队 = home_goals, 客队 = away_goals ) |> pivot_longer(everything(), names_to = "队伍", values_to = "进球数") |> count(队伍, 进球数, name = "出现次数") |> group_by(队伍) |> mutate(频率 = 出现次数 / sum(出现次数)) |> ungroup() # 绘制并列柱状图 ggplot(plot_data, aes(x = factor(进球数), y = 频率, fill = 队伍)) + geom_col(position = position_dodge(width = 0.9), alpha = 0.8) + labs(x = "进球数", y = "出现频率", fill = "队伍类型") + theme_bw()
方案2:基于已有宽表转换
如果已经生成了包含HomeGoals、Freq.x、Freq.y的宽表,直接转长格式即可:
# 假设已有的宽表名为df,结构为HomeGoals、Freq.x(主队频率)、Freq.y(客队频率) plot_data <- df |> pivot_longer(cols = c(Freq.x, Freq.y), names_to = "队伍", values_to = "频率") |> mutate(队伍 = case_when( 队伍 == "Freq.x" ~ "主队", 队伍 == "Freq.y" ~ "客队" )) # 后续绘图代码和方案1完全一致 ggplot(plot_data, aes(x = factor(HomeGoals), y = 频率, fill = 队伍)) + geom_col(position = position_dodge(width = 0.9), alpha = 0.8) + labs(x = "进球数", y = "出现频率", fill = "队伍类型") + theme_bw()
关键说明
factor(进球数)是为了将进球数转为离散变量,避免X轴出现非整数刻度position_dodge(width = 0.9)保证并列柱状图之间的间距合理,可根据需求调整- 如果需要展示原始出现次数而非频率,直接将Y轴映射改为
出现次数即可
内容的提问来源于stack exchange,提问作者Stephen Russell
相关产品推荐
相关产品推荐

