ggsoccer 包:绘制足球相关数据

简介: ggsoccer 包:绘制足球相关数据

简介

今天介绍一个与足球相关的 R 包。如果你也对体育感兴趣,可以看看:CRAN任务视图:Sports Analytics

ggsoccer[1]包可以基于 ggplot[2]  图层,绘制足球相关数据。

安装

通过 CRAN 下载

install.packages("ggsoccer")

或者通过 Github 下载

# install.packages("remotes")
remotes::install_github("torvaney/ggsoccer")

使用教程

通过 annotate_pitch()theme_pitch() 即可得到

library(ggplot2)
library(ggsoccer)
ggplot() +
  annotate_pitch() +
  theme_pitch()

其实,你也可以通过 ggplot 直接复现这个图形。文末给出完整版代码,供读者参考。

在上面的基础上,给出两个常用的例子:

绘制传球路线

添加传球路线数据,如下所示

pass_data <- data.frame(x = c(24, 18, 64, 78, 53),
                        y = c(43, 55, 88, 18, 44),
                        x2 = c(34, 44, 81, 85, 64),
                        y2 = c(40, 62, 89, 44, 28))

通过 geom_segment() 将传球数据进行绘制。direction_label() 添加图底部标签。annotate_pitch() 中可以修改足球场颜色。

ggplot(pass_data) +
  annotate_pitch(colour = "white",
                 fill = "#3ab54a") +
  geom_segment(aes(x = x, y = y, xend = x2, yend = y2),
               arrow = arrow(length = unit(0.25, "cm"),
                             type = "closed")) +
  theme_pitch() +
  direction_label()

如果你想将图形旋转 90 度,并只展示半个足球场。可以配合 coord_flip(xlim = c(49, 101))scale_y_reverse() 使用。

绘制投射情况

接下来,再给一个相似的例子,展示某个队伍的投射点位以及是否射中。

df <- data.frame(x = rnorm(20, 80, 10), 
                 y = rnorm(20, 50, 20),
                 Shot = sample(c("In", "Out"),
                               40, replace = TRUE))

此时,使用 geom_point() 添加投射点,根据 fill = Shot 进行填充分类。配合 coord_cartesian(xlim = c(45, 105)) 展示水平的半个足球场。

library(viridis)
ggplot(df) +
  annotate_pitch(colour = "white",
                 fill = "#3ab54a") +
  geom_point(aes(x = x, y = y, fill = Shot),
             shape = 21,
             size = 4) +
  coord_cartesian(xlim = c(45, 105))+ 
  scale_fill_viridis(discrete=T) +
  theme_pitch() +
  theme(panel.background = element_rect(fill = "#3ab54a"))

ggplot 复现版本

ggplot()+
  geom_rect(aes(xmin = -10, xmax = 100, ymin= -10, ymax = 130), fill = "#3ab54a", colour = "#FFFFFF", size = 0.5)+ ### Background outline
  geom_rect(aes(xmin = 0, xmax = 90, ymin= 0, ymax = 120), fill = "#3ab54a", colour = "#FFFFFF", size = 0.5)+ ###Sideline, Endline
  geom_rect(aes(xmin = 0, xmax = 90, ymin= 0, ymax = 60), fill = NA , colour = "#FFFFFF", size = 0.5)+ #Halfway
  geom_rect(aes(xmin = 24.85, xmax = 65.15, ymin= 0, ymax = 16.5), fill = "#3ab54a", colour = "#FFFFFF", size = 0.5)+ #lower 18 yard box
  geom_rect(aes(xmin = 35.85, xmax = 54.15, ymin= 0, ymax = 5.5), fill = "#3ab54a", colour = "#FFFFFF", size = 0.5)+ # Lower 5 yard box
  geom_rect(aes(xmin = 24.85, xmax = 65.15, ymin= 103.5, ymax = 120), fill = "#3ab54a", colour = "#FFFFFF", size = 0.5)+ #upper 18 yard box
  geom_rect(aes(xmin = 35.85, xmax = 54.15, ymin= 114.5, ymax = 120), fill = "#3ab54a", colour = "#FFFFFF", size = 0.5)+ #upper 5 yard box
  geom_curve(aes(x = 35.85, y = 16.5, xend = 54.15, yend = 16.5), curvature = -0.6, colour = "#FFFFFF")+ #lower D
  geom_curve(aes(x = 35.85, y = 103.5, xend = 54.15, yend = 103.5), curvature = .6, colour = "#FFFFFF")+ #upper D
  ggforce::geom_circle(aes(x0=45, y0=60, r= 9.15), colour = "#FFFFFF")+ ##Halfway circle 
  # coord_flip(xlim = c(49, 101)) +
  coord_flip() +
  scale_y_reverse() +
  theme(rect = element_blank(),
        line = element_blank(),
        text = element_blank())

小编有话说

本文介绍了绘制足球数据的 ggsoccer 包。如果你也对足球感兴趣,并想做一些数据分析。那么你可以从下面包中获取感兴趣的足球数据,然后基于 ggsoccer 包进行可视化。例如:

  • worldfootballR[3] 提供来自许多热门网站的足球数据。
  • 欧洲足球数据可通过 engsoccerdata[4] 包获得,数据可追溯至 1871 年。
  • socceR[5]提供评估足球预测和模拟足球比赛和锦标赛结果的功能。
  • footballpenaltiesBL[6] 可以分析 德国男子德甲联赛[7] 从 1963-64 赛季到 2016-17 赛季的数据。
  • footBayes[8] 包含一些拟合足球的模型(例如:双泊松、双变量泊松、Skellam、Student's t)的函数。拟合方法是包括 Hamiltonian 蒙特卡罗法和最大似然估计法。该软件包还提供了可视化团队实力和预测比赛结果的工具。
  • itschalledsoccer[9] 允许通过 API[10] 访问美式足球(MLS、NWSL 和 USL)数据 。

参考资料

[1]

ggsoccer: https://torvaney.github.io/ggsoccer/

[2]

ggplot: https://ggplot2.tidyverse.org/

[3]

worldfootballR: https://cran.r-project.org/web/packages/worldfootballR/index.html

[4]

engsoccerdata: https://cran.r-project.org/web/packages/engsoccerdata/index.html

[5]

socceR: https://cran.r-project.org/web/packages/socceR/index.html

[6]

footballpenaltiesBL: https://cran.r-project.org/web/packages/footballpenaltiesBL/index.html

[7]

德国男子德甲联赛: https://www.bundesliga.com/

[8]

footBayes: https://cran.r-project.org/web/packages/footBayes/index.html

[9]

itschalledsoccer: https://cran.r-project.org/web/packages/itscalledsoccer/index.html

[10]

API: https://app.americansocceranalysis.com/

目录
相关文章
|
人工智能 弹性计算 算法
一文解读:阿里云AI基础设施的演进与挑战
对于如何更好地释放云上性能助力AIGC应用创新?“阿里云弹性计算为云上客户提供了ECS GPU DeepGPU增强工具包,帮助用户在云上高效地构建AI训练和AI推理基础设施,从而提高算力利用效率。”李鹏介绍到。目前,阿里云ECS DeepGPU已经帮助众多客户实现性能的大幅提升。其中,LLM微调训练场景下性能最高可提升80%,Stable Difussion推理场景下性能最高可提升60%。
128120 268
|
10月前
|
Web App开发 编解码 数据可视化
实时云渲染解决像素流2更新带来的UE引擎版本适配及云推流插件迁移问题
UE5.5版本发布了新版像素流送插件,即像素流送2的技术栈。老版本插件以及低版本程序升级迁移会带来诸多问题。实时云渲染作为一种成熟的云推流平台,不受限于引擎版本、插件版本,让开发者专注于使用UE引擎开发3D场景,PaaS平台一键推流,与业务系统通过SDK及功能组件等方式无缝衔接。
973 154
|
10月前
|
数据采集 存储 Web App开发
处理Cookie和Session:让Python爬虫保持连贯的"身份"
处理Cookie和Session:让Python爬虫保持连贯的"身份"
|
网络协议 自动驾驶 物联网
计算机网络的发展
本文概述了计算机网络从20世纪60年代的雏形到现代互联网的发展历程,包括ARPANET的创建、TCP/IP协议的标准化、DNS系统的引入、万维网的诞生、宽带和无线网络的兴起,以及移动互联网、云计算、物联网、区块链和自动驾驶技术的最新进展。
1265 1
|
SQL 监控 API
Flink SQL支持写判断语句
【2月更文挑战第8天】Flink SQL支持写判断语句
907 12
|
存储 关系型数据库 MySQL
【mysql】文本字符串类型
【mysql】文本字符串类型
5118 1
【mysql】文本字符串类型
|
安全 搜索推荐 Android开发
安卓与iOS:两大操作系统的比较
本文将深入探讨安卓和iOS两大操作系统的差异,包括它们的设计理念、用户界面、应用生态以及安全性等方面。通过对比分析,我们可以更好地理解这两个系统各自的优势和不足,从而为用户在选择手机时提供一些参考。
|
API 语音技术 开发者
用python实现文字转语音的5个较好用的模块
这篇文章介绍了五个Python模块:gtts、pyttsx3、baidu-aip、pywin32和speech,它们能够实现文本到语音的转换功能。
1734 1
|
人工智能 运维 Serverless
【云故事探索】NO1:看森马服饰,在阿里云上如何用AI实现创新?
在数字化转型中,云计算成为企业创新的关键驱动力。森马服饰借助阿里云函数计算,应对新零售挑战,实现业务模式重塑和效率提升。面对AI技术落地的困难,如高成本、长决策周期和复杂运维,森马通过阿里云的Serverless解决方案,快速将AI融入核心业务,优化了从设计到营销的全链条流程。通过函数计算,森马降低了AI项目初期的硬件投入和运维难题,提升了设计师的工作效率,将设计时间从3天缩短到30秒,实现了服装设计和营销的智能化升级。
【云故事探索】NO1:看森马服饰,在阿里云上如何用AI实现创新?