You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:45:03