最近看了一篇文章是有关于NBA球员出手数据的可视化案例,原文链接如下。

虎扑热帖|Python数据分析|NBA的球星们喜欢在哪个位置出手

个人感觉比较有趣,所以想着自己也来实现一波。

总体上来说差不多,可能就是美观点吧...

/ 01 / 篮球场

从网上找的篮球场尺寸图,如下。

其中单位为英尺,NBA的球场尺寸为94英尺长,50英尺宽。

下图是我用CAD绘制半场尺寸图,本次绘图就是按照下面这个尺寸来的。

有了尺寸,接下来就可以使用matplotlib进行绘制篮球场了。

主要是绘制矩形、圆形以及圆弧。

具体代码如下。from matplotlib import pyplot as pltfrom matplotlib.patches import Arc, Circle, Rectangledef draw_ball_field(color="#20458C", lw=2): """ 绘制篮球场 """ # 新建一个大小为(6,6)的绘图窗口 plt.figure(figsize=(6, 6)) # 获得当前的Axes对象ax,进行绘图 ax = plt.gca() # 对篮球场进行底色填充 lines_outer_rec = Rectangle(xy=(-250, -47.5), width=500, height=470, linewidth=lw, color="#F0F0F0", fill=True) # 设置篮球场填充图层为最底层 lines_outer_rec.set_zorder(0) # 将rec添加进ax ax.add_patch(lines_outer_rec) # 绘制篮筐,半径为7.5 circle_ball = Circle(xy=(0, 0), radius=7.5, linewidth=lw, color=color, fill=False) # 将circle添加进ax ax.add_patch(circle_ball) # 绘制篮板,尺寸为(60,1) plate = Rectangle(xy=(-30, -7.5), width=60, height=-1, linewidth=lw, color=color, fill=False) # 将rec添加进ax ax.add_patch(plate) # 绘制2分区的外框线,尺寸为(160,190) outer_rec = Rectangle(xy=(-80, -47.5), width=160, height=190, linewidth=lw, color=color, fill=False) # 将rec添加进ax ax.add_patch(outer_rec) # 绘制2分区的内框线,尺寸为(120,190) inner_rec = Rectangle(xy=(-60, -47.5), width=120, height=190, linewidth=lw, color=color, fill=False) # 将rec添加进ax ax.add_patch(inner_rec) # 绘制罚球区域圆圈,半径为60 circle_punish = Circle(xy=(0, 142.5), radius=60, linewidth=lw, color=color, fill=False) # 将circle添加进ax ax.add_patch(circle_punish) # 绘制三分线的左边线 three_left_rec = Rectangle(xy=(-220, -47.5), width=0, height=140, linewidth=lw, color=color, fill=False) # 将rec添加进ax ax.add_patch(three_left_rec) # 绘制三分线的右边线 three_right_rec = Rectangle(xy=(220, -47.5), width=0, height=140, linewidth=lw, color=color, fill=False) # 将rec添加进ax ax.add_patch(three_right_rec) # 绘制三分线的圆弧,圆心为(0,0),半径为238.66,起始角度为22.8,结束角度为157.2 three_arc = Arc(xy=(0, 0), width=477.32, height=477.32, theta1=22.8, theta2=157.2, linewidth=lw, color=color, fill=False) # 将arc添加进ax ax.add_patch(three_arc) # 绘制中场处的外半圆,半径为60 center_outer_arc = Arc(xy=(0, 422.5), width=120, height=120, theta1=180, theta2=0, linewidth=lw, color=color, fill=False) # 将arc添加进ax ax.add_patch(center_outer_arc) # 绘制中场处的内半圆,半径为20 center_inner_arc = Arc(xy=(0, 422.5), width=40, height=40, theta1=180, theta2=0, linewidth=lw, color=color, fill=False) # 将arc添加进ax ax.add_patch(center_inner_arc) # 绘制篮球场外框线,尺寸为(500,470) lines_outer_rec = Rectangle(xy=(-250, -47.5), width=500, height=470, linewidth=lw, color=color, fill=False) # 将rec添加进ax ax.add_patch(lines_outer_rec) return axaxs = draw_ball_field(color="#20458C", lw=2)# 设置坐标轴范围axs.set_xlim(-250, 250)axs.set_ylim(422.5, -47.5)# 消除坐标轴刻度axs.set_xticks([])axs.set_yticks([])# 添加备注信息plt.annotate("By xiao F", xy=(100, 160), xytext=(178, 418))plt.show()

最后得到下图。

下面去获取球员的投篮数据。

/ 02 / 投篮数据

投篮数据来源于NBA官方网站——NBA Stats。

在这个网页下打开开发者工具,找到下面这个请求。

便能获取到球员的投篮数据,本次只获取球员的投篮点及是否得分的数据。

这里以「库里」为例,爬取代码如下。import requestsimport jsonheaders = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" }# 球员职业生涯时间years = [2018, 2019]for i in range(years[0], years[1]): # 赛季 season = str(i) + "-" + str(i + 1)[-2:] # 球员ID player_id = "201939" # 请求网址 url = "https://stats.nba.com/stats/shotchartdetail?AheadBehind=&CFID=33&CFPARAMS=" + season + "&ClutchTime=&Conference=&ContextFilter=&ContextMeasure=FGA&DateFrom=&DateTo=&Division=&EndPeriod=10&EndRange=28800&GROUP_ID=&GameEventID=&GameID=&GameSegment=&GroupID=&GroupMode=&GroupQuantity=5&LastNGames=0&LeagueID=00&Location=&Month=0&OnOff=&OpponentTeamID=0&Outcome=&PORound=0&Period=0&PlayerID=" + player_id + "&PlayerID1=&PlayerID2=&PlayerID3=&PlayerID4=&PlayerID5=&PlayerPosition=&PointDiff=&Position=&RangeType=0&RookieYear=&Season=" + season + "&SeasonSegment=&SeasonType=Regular+Season&ShotClockRange=&StartPeriod=1&StartRange=0&StarterBench=&TeamID=0&VsConference=&VsDivision=&VsPlayerID1=&VsPlayerID2=&VsPlayerID3=&VsPlayerID4=&VsPlayerID5=&VsTeamID=" # 请求结果 response = requests.get(url=url, headers=headers) result = json.loads(response.text) # 获取数据 for item in result["resultSets"][0]["rowSet"]: # 是否进球得分 flag = item[10] # 横坐标 loc_x = str(item[17]) # 纵坐标 loc_y = str(item[18]) with open("curry.csv", "a+") as f: f.write(loc_x + "," + loc_y + "," + flag + "\n")

获取到的数据如下。

其中可以通过设置球员ID以及赛季时间来获取不同的数据。

球员ID和赛季时间可以通过官网中的球员信息网页了解到。

/ 03 / 数据可视化

现在球场有了,投篮数据也有了,就可以来画图了。

使用matplotlib的散点图来实现。import pandas as pd# 读取数据df = pd.read_csv("curry.csv", header=None, names=["width", "height", "type"])# 分类数据df1 = df[df["type"] == "Made Shot"]df2 = df[df["type"] == "Missed Shot"]# 绘制散点图axs.scatter(x=df2["width"], y=df2["height"], s=30, marker="x", color="#A82B2B")axs.scatter(x=df1["width"], y=df1["height"], s=30, marker="o", edgecolors="#3A7711", color="#F0F0F0", linewidths=2)

得到下图。

来和官网的图对比一下。

看起来还不错,匹配度还是蛮高的。

下面绘制投篮热力图,通过seaborn绘制,代码如下。import seaborn as snsimport matplotlib as mpl# 读取数据df = pd.read_csv("curry.csv", header=None, names=["width", "height", "type"])def colormap(): """ 颜色转换 """ return mpl.colors.LinearSegmentedColormap.from_list("cmap", ["#C5C5C5", "#9F9F9F", "#706A7C", "#675678", "#713A71","#9D3E5E", "#BC5245", "#C86138", "#C96239", "#D37636", "#D67F39", "#DA8C3E", "#E1A352"], 256)# 绘制球员投篮热力图shot_heatmap = sns.jointplot(df["width"], df["height"], stat_func=None, kind="kde", space=0, color="w", cmap=colormap())# 设置图像大小shot_heatmap.fig.set_size_inches(6, 6)# 图像反向ax = shot_heatmap.ax_joint# 绘制投篮散点图ax.scatter(x=df["width"], y=df["height"], s=0.1, marker="o", color="w", alpha=1)# 添加篮球场draw_ball_field(color="w", lw=2)# 将坐标轴颜色更改为白色lines = plt.gca()lines.spines["top"].set_color("none")lines.spines["left"].set_color("none")# 去除坐标轴标签ax.axis("off")

得到结果如下。

还是来看一下官网的图。

两个效果都不错,不过边框我没调好,显得没那么好看。

库里投篮最密集的区域,篮下和三分线。

最后看一下于小F而言,印象比较深的球员,「科比」和「霍华德」。

「科比」的ID为977,职业生涯时间为1996年到2012年。

全线开花,不少负角度投篮,甚至还有超远三分。

「霍华德」的ID为2730,职业生涯时间为2004年到2019年。

魔兽霍华德,屈指可数的三分。

其他都是围绕着篮板的得分。

还有好多球员,就靠大伙自己去看啦!

/ 04 / 总结

好了,本次更文到此结束。

感兴趣的小伙伴可以自行动手,操作一波。

python绘图篮球_用Python把NBA球员投篮数据可视化相关推荐

  1. NBA球员投篮数据可视化

    最近看了公众号「Crossin的编程教室」的一篇文章. 是有关于NBA球员出手数据的可视化案例,原文链接如下. 个人感觉比较有趣,所以想着自己也来实现一波. 总体上来说差不多,可能就是美观点吧... ...

  2. python编写篮球_自制python版篮球经理游戏(1)—准备

    今天突发奇想,打算做一个单击模拟版的篮球经理游戏,主要功能包括随机组队.抽卡.更换阵容和模拟比赛.具体的等想到了再往里添加,目前设计的游戏流程是这样的: 今天就先来完成准备工作. 尽然是模拟抽卡的游戏 ...

  3. python编写篮球_自制python版篮球经理游戏(5)—代码

    游戏已全部完成,虽然和最初的设计有了些许偏差,但完成度达到了90%以上.完整代码在附件里,注释介绍了一些算法逻辑,并未对语句做详细地讲解,不过都是tkinter的一些基本语句,有疑问的地方直接百度即可 ...

  4. NBA 投篮数据可视化,4行代码就能实现!

    作者 | 小F 来源 | 法纳斯特(ID:walker398) 头图 |  CSDN 下载自东方IC 之前小F说了G6湖人总冠军,果不其然湖人夺冠了. 不过硬实力摆在那里,说不说其实关系也不大,哈哈哈 ...

  5. NBA 投篮数据可视化,4 行代码就能实现!

    作者 | 小F 来源 | 法纳斯特(ID:walker398) 头图 |  CSDN 下载自东方IC 之前小F说了G6湖人总冠军,果不其然湖人夺冠了. 不过硬实力摆在那里,说不说其实关系也不大,哈哈哈 ...

  6. 爬table数据_爬取NBA球员薪资数据【Python数据分析百例连载】

    通过Pandas模块也可以实现简单的爬虫.主要使用Pandas的read_html方法,该方法用于导入带有table标签的网页表格数据,语法如下: pandas.read_html(io,match= ...

  7. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  8. python 定义变量_用python解决动态的定义变量名(并给其赋值方法:大数据处理)...

    前言: 今天为大家带来的内容是:用python解决动态的定义变量名(并给其赋值方法:大数据处理)具有很好的参考价值,希望对大家有所帮助.喜欢本文内容的记得点赞转发收藏不迷路哦!!! 最近消费kafka ...

  9. python机器学习预测_使用Python和机器学习预测未来的股市趋势

    python机器学习预测 Note from Towards Data Science's editors: While we allow independent authors to publish ...

最新文章

  1. 好奇了好久的「对象」,就这?
  2. 对超线程几个不同角度的解释
  3. 使用nmap-converter将nmap扫描结果XML转化为XLS实战
  4. python获取当前服务器ip_Python实现获取域名所用服务器的真实IP
  5. pgsql 前10条_白沙湾南片区11条新建道路最新进度及建成时间,已建成一条!还有一条将通车...
  6. 定位导致物化视图无法快速刷新的原因
  7. 5.4 ~ 5.6 刷题记录
  8. [vagrant]vagrant centos静态ip设置
  9. ipmsg飞鸽传书系统即时通讯
  10. 前端开发的壁垒在哪儿?
  11. bat 暂停一段时间_BAT面试问是否具备3年工作经验,这么回答绝了!
  12. android中如何如何让dailog横屏显示
  13. 台式计算机键盘灯打开方式,台式电脑开机时键盘灯不亮,必须要按一下Numlock才会亮,但系统没什么问题。怎么办?...
  14. CSS实现鼠标经过div时改变背景图片
  15. Arcgis教程:如何批量统计网格内的线段长度。
  16. 记录每天学习的新知识:LiveData
  17. EasyExcel合并单元格策略样例
  18. 4.20 视频面试字节_光大银行_神策
  19. java 删除本地图片_java如何删除
  20. K8S 集群部署(快速部署一个 K8S 集群)

热门文章

  1. 《UVM实战》学习笔记——第四章 UVM中的TLM1.0通信
  2. Cobalt Strike Aggressor Script
  3. 《Cloud Native Data Center Network》读书笔记-1
  4. WML语言基础-WML语言基础(WAP建站)
  5. 德国风力发电机发电数据集(13w多条数据)
  6. scala中case class与一般的class的区别
  7. 3dMax模型导入SuperMap
  8. IBM X系列服务器、刀片中心安装指南和用户手册、操作系统安装指南(中文版)汇总
  9. Web前端第三阶段学习
  10. CSS Table(表格)