网罗天下体育资讯

如何用 Python 的 matplotlib 包绘制 NBA 球员投篮出手位置图

  • 时间:2024-06-26 13:48:31|
  • 来源:JRS

经过查找,我发现网上也有相关的资源,大部分都是出自How to NBA Shot in(),但是现在我无法按照这些教程进行复现。

本文将具体实用的介绍如何使用该包绘制NBA球员投篮位置图。

为了做到这一点,我们需要解决两个主要问题:

哪里可以获取NBA球员的投篮数据(网上现有的资源大部分都卡在这里)

如何绘制图表

我们将练习以下知识:

如何通过网站分析获取数据API

获取网页数据的基本方法

绘制篮球半场图

第 1 部分 - 获取球员投篮位置数据

NBA 没有提供公开的 API 来方便访问球员的投篮日志。Web 201:API() 提供了一种分析网页以查找数据的 API。要分析 NBA 球员的投篮日志,我们可以将其分解为以下步骤:

锁定目标网站(哪个网站有NBA球员投篮日志数据)

特定网页对象(哪个特定网页有拍摄日志数据)

分析射击日志 API

通过API获取您感兴趣的球员的投篮日志数据

1. 锁定目标网站

2. 具体网页对象

拍摄日志所在的页面标签可能会发生变化,而且有时候并不是在很显眼的位置,这也是很多教程失效的原因(只给出了最终的API URL,但是没有说这个URL是怎么来的),所以要花时间去找。

按图中顺序点击1和2,得到以下页面

页面上的表格是每个NBA球员的数据,表格表头都是缩写,点击图标可以得到表格表头的详细信息,表头表示投篮的出手位置。表格中每个球员所在列的数字都是可点击的,我们点击如上图所示的列号,跳转结果为展示2017-18赛季常规赛。

好的,我们现在可以结束了……

等等,我们的目标不是简单地得到,而是,所以,继续

点开的数据,跳转后的页面除了上面3张图外,还包括下表

这个表格的内容结合图片就知道我们要找的这个页面了,但是表格中并没有直接给出拍摄位置的信息,这个网页访问的API应该包含这些信息,所以我们进行下面的步骤。

3.分析射击日志API

我们以浏览器为例,在上一步找到的页面中打开浏览器的开发者选项(更多工具 -> 开发者工具),然后按 F5 刷新页面,你将得到以下页面:

我们点击上图中的红色数字,选中,然后点击过滤。Yes 是缩写——这是一种用于获取 XML 或 JSON 数据的请求类型。过滤之后,表格中出现了几项。红色数字 3 就是我们要找的 shot log API。标签包括:

- 请求的名称。

- 请求参数,提交给API的参数,我们可以把它们看成是SQL条件语句,比如赛季,球员ID等,通过改变URL中的参数,我们可以得到不同的数据。

- 请求的数据集包含两个表。仔细查看表头()。第一个表包含我们想要的射击日志信息(LOCX、LOCY)。

同一列中列出的标签包括:

URL - API 网址

- 请求头nba球员位置图,爬取网页时用于请求数据

通过API获取您感兴趣的球员的投篮日志数据

4.通过API获取你感兴趣的球员的投篮日志数据

上一步我们获取了本赛季MVP候选人的URL和投篮日志,现在我们需要通过代码获取投篮日志数据,以下是代码

得到:,表头及前3行数据如下:

其中nba球员位置图,,,为可变参数,如果想获取其他球员,可以登录/搜索自己感兴趣的球员名字,如下

点击搜索结果,跳转到该页面URL的最后一项,比如:中间的就是的。

这一步我们得到的内容包含了詹姆斯在 2017-18 常规赛(全明星赛)迄今为止尝试的所有投篮。我们需要的数据是两列nba球员位置图,这些是每次投篮尝试的坐标值,然后可以将其绘制在代表篮球场的坐标轴上。当然,我们可能还需要一列来区分投篮是否命中。

第 2 部分 - 将球员的投篮记录映射到球场上

关于这一部分,How to NBA Shot in 已经做得非常出色了。我们会延续它的框架,并修改代码,以达到更好的适用性。

首先,我们快速绘制上一步得到的詹姆斯的投篮日志,看看 X 和 Y 是如何定义的。

通过快速预览,我们对 和 有了大致的了解。有一点需要注意:其实 是从中场往篮筐看,观众视野范围内,如果是正向的话,就是在篮筐的左侧。所以在绘制最终图像的时候,需要按照下面的代码进行调整。我们以 shot log 中 Right Side (R) 投篮区域的投篮(投篮区域的划分请参考上图)为例。

画一个篮球场半场示意图

通过快速绘制和的数据,我们知道篮筐的位置大致就是和的原点。知道了这一点,我们就可以根据篮球半场的具体尺寸和比例绘制篮球半场图(如下图)。

从上图我们知道篮球场的宽度为 ,转换为 ,篮球场的长度为 ,转换为 。结合上一步我们画出的投篮点的快速预览,通过对比很多球员的数值为 0,,我们可以推断出 和 的单位转换为 大约是 10/12。

绘图函数如下:

绘画:

添加了射击位置数据