用 Python 创建 NBA 得分图表

在这篇文章中,我研究了如何提取一个篮球运动员的得分图数据,然后使用 matplotlibseaborn 绘制得分图。

获取数据

从 stats.nba.com 获取数据是非常简单的。虽然 NBA 没有提供一个公共的 API,但是实际上我们可以通过使用 requests 库来访问 NBA 用在 stats.nba.com 上的 API。Greg Reda 发布的这篇博客很好地解释了如何访问这个 API(或者为任意 web 应用找到一个 API 来完成上述问题)。

我们将会使用这个 URL 来获取 James Harden 的得分图数据。

上述 URL 发送给我们一个 JSON 文件,该文件包含我们想要的数据。也要注意到 URL 包含了用于访问数据的各种 API 参数。URL 中被设置为 201935 的 PlayerID 参数就是 James Harden 的 PlayerID

现在让我们使用 requests 库来获取我们想要的数据。

利用获取到的得分图数据创建一个 pandas DataFrame

 

上述的得分图数据包含了 2014-15 常规赛期间 James Harden 所有的投篮出手次数。我们想要的数据在 LOC_XLOC_Y 中。这是每次投篮出手位置的坐标值,然后就可以在代表篮球场的一组坐标轴上绘制这些坐标值了。

绘制得分图数据

让我们快速地绘制数据,看看数据是如何分布的。

注意到上述的图表没能很好的表示数据。横坐标轴上的值与实际的相反了。下面只把右边的投篮绘制出来,看看问题出在哪里。

正如我们所看到的,属于“右侧”出手的投篮,虽然是位于观看者的右边,但是实际上位于篮框的左边。在创建我们最终的得分图时,这是需要我们解决的问题。

绘制篮球场

首先我们需要了解如何在图表上绘制球场线。通过查看第一张图片和数据,我们可以大概估计球场的中心位于原点。我们也可以估算在 x 轴或者 y 轴上每 10 个单位代表 1 英尺。我们可以通过查看 DataFrame 中第一条记录来验证前面的估算。某个投篮是从距离为 22 英尺的右边底角 3 分线出手的,而 22 英尺对应 LOC_X 的值为 226。所以那个投篮是从球场右边大约 22.6 英尺的地方出手的。现在我们知道这个之后,我们可以在图表上绘制球场了。

篮球场的尺寸可以查看这里这个网址

利用这些尺寸,我们可以将它们转换成适合我们图表大小的尺寸,并且使用 Matplotlib Patches 来绘制。我们将使用 CircleRectangleArc 对象来绘制我们的球场。现在要创建函数来绘制篮球场了。

NOTE:虽然你可以使用 Lines2D 在图上绘制线条,但是我发现用 Rectangles 会更加方便(不带一个高度或者宽度)。

编辑(Aug 4, 2015):我在绘制外线和半场弧形的时候犯了一个错误。外面的球场线高度从错误的值 442.5 改成 470。球场中央弧形的中心,其 y 值从 395 改到 422.5。在图表上,y 轴范围上的值从 (395, -47.5) 改成 (422.5, -47.5)。

让我们绘制我们的球场吧

创建一些得分图

现在绘制经过我们适当调整的得分图数据和球场。我们可以用两种方法调整 x 值。可以传递 LOC_X 的负数给 plt.scatter,或者将降序的值传给 plt.xlim。我们将会使用后者来绘制我们的得分图。

调整得分图,使得篮框位于图表的顶部,这与 stats.nba.com 上的得分图方向一致。我们通过将递减的 y 值从 y 轴的底部设置到顶部来实现前面所说的效果。当这样做的时候,我们就不再需要调整图片的 x 值。

使用 seaborn 中的 jointplot 来创建一些得分图。

获取一个球员的图片

我们也可以从 stats.nba.com 上获取 James Harden 的照片并且将它放到我们的图表上。我们可以在这个 URL 找到他的图片。

为了获取图片给我们的图表使用,我们可以像下面一样使用 url.requests 中的 urlretrieve

现在可以将 Harden 的脸绘制到一个 jointplot 上了。我们将会导入 matplotlib.Offset 中的 OffsetImage 模块,该模块允许我们将图片放到图表的右上角。所以让我们像前面所做的一样去创建得分图,但是这次我们将会创建一个 KDE(核心密度估计)jointplot 并且在最后添加我们的图片。

另一个用 hexbins 的 jointplot

编辑:根据 Ogi010 的建议,我使用新的 Viridis matplotlib 颜色映射(你可以在这里找到该映射),重新创建 KDE 图表。

延伸阅读和资源

我创建了一个模块,该模块包含了上述所有的功能,你可以在这里找到该模块。

Bradley Fey 写了这样一个非常酷的包,可以让你通过一个很好用的 Python 封装器来访问 stats.nba.com 上大量的数据。

如果你想阅读更多关于如何使用 Python 获取数据的话,我建议阅读一些 Greg Reda 的贴子这是另一个很好的贴子,它介绍了如何从 stats.nba.com 上获取数据。

如果你发现任何问题或者有任何疑问,请在下面留言。

打赏支持我翻译更多好文章,谢谢!

打赏译者

打赏支持我翻译更多好文章,谢谢!

2 16 收藏 评论

关于作者:Sam Lin

伪程序员 个人主页 · 我的文章 · 43 ·   

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部