文章目录

  • 1 画篮球场
  • 2 爬数据
  • 3 可视化投篮结果
  • 4 Kobe Bryant
  • 5 Others

代码来源:

  • 用Python把NBA球员投篮数据可视化

  • 虎扑热帖|数据分析|用python展示NBA球员出手喜好


1 画篮球场

from matplotlib import pyplot as plt
from matplotlib.patches import Arc, Circle, Rectangle
%matplotlib inlinedef draw_ball_field(color='#20458C', lw=2):"""绘制篮球场"""# 新建一个大小为(6,6)的绘图窗口plt.figure(figsize=(9, 9))# 获得当前的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添加进axax.add_patch(lines_outer_rec)# 绘制篮筐,半径为7.5circle_ball = Circle(xy=(0, 0), radius=7.5, linewidth=lw, color=color, fill=False)# 将circle添加进axax.add_patch(circle_ball)# 绘制篮板,尺寸为(60,1)plate = Rectangle(xy=(-30, -7.5), width=60, height=-1, linewidth=lw, color=color, fill=False)# 将rec添加进axax.add_patch(plate)# 绘制2分区的外框线,尺寸为(160,190)outer_rec = Rectangle(xy=(-80, -47.5), width=160, height=190, linewidth=lw, color=color, fill=False)# 将rec添加进axax.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添加进axax.add_patch(inner_rec)# 绘制罚球区域圆圈,半径为60circle_punish = Circle(xy=(0, 142.5), radius=60, linewidth=lw, color=color, fill=False)# 将circle添加进axax.add_patch(circle_punish)# 绘制三分线的左边线three_left_rec = Rectangle(xy=(-220, -47.5), width=0, height=140, linewidth=lw, color=color, fill=False)# 将rec添加进axax.add_patch(three_left_rec)# 绘制三分线的右边线three_right_rec = Rectangle(xy=(220, -47.5), width=0, height=140, linewidth=lw, color=color, fill=False)# 将rec添加进axax.add_patch(three_right_rec)# 绘制三分线的圆弧,圆心为(0,0),半径为238.66,起始角度为22.8,结束角度为157.2three_arc = Arc(xy=(0, 0), width=477.32, height=477.32, theta1=22.8, theta2=157.2, linewidth=lw, color=color, fill=False)# 将arc添加进axax.add_patch(three_arc)# 绘制中场处的外半圆,半径为60center_outer_arc = Arc(xy=(0, 422.5), width=120, height=120, theta1=180, theta2=0, linewidth=lw, color=color, fill=False)# 将arc添加进axax.add_patch(center_outer_arc)# 绘制中场处的内半圆,半径为20center_inner_arc = Arc(xy=(0, 422.5), width=40, height=40, theta1=180, theta2=0, linewidth=lw, color=color, fill=False)# 将arc添加进axax.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添加进axax.add_patch(lines_outer_rec)return ax

调用一下

axs = 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()

2 爬数据

import requests
import 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'}def shot_data(years,player_id):# years 球员职业生涯时间, list# player_id 球员ID, strfor i in range(years[0], years[1]):# 赛季season = str(i) + '-' + str(i + 1)[-2:]# 请求网址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')

调用一下

years = [2017, 2019]# 球员职业生涯时间
player_id = '201939'# 球员ID
shot_data(years,player_id)

201939 是 Stephen Curry

生成

如下所示:

3 可视化投篮结果

import pandas as pd
import urllib.request
from matplotlib.offsetbox import  OffsetImagedef draw_shot(player_id):# 读取数据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 = draw_ball_field(color='#20458C', lw=2)# 绘制散点图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)# 设置坐标轴范围axs.set_xlim(-250, 250)axs.set_ylim(422.5, -47.5)# 消除坐标轴刻度axs.set_xticks([])axs.set_yticks([])# 添加备注信息plt.annotate('By Bryant', xy=(90, 160), xytext=(190, 418))# 画头像pic = urllib.request.urlretrieve("http://stats.nba.com/media/players/230x185/" + player_id + ".png")head_pic = plt.imread(pic[0])  # urlretrieve 返回元组,image 在第一个 img = OffsetImage(head_pic, zoom=0.6) # 将球员图片放置于左下角,并设置缩小等级以配合整个图片img.set_offset((45,45))  # (x, y) 控制将球员放在你想要放的位置axs.add_artist(img)      # 添加球员图片plt.show()

调用一下(只用了17,19年的数据)

draw_shot('201939')


哈哈,只画了半场,不能完全展现出萌神的 logo shot

4 Kobe Bryant

Kobe Bryant 是 977,球员 ID 通过 https://stats.nba.com/players/ 可以知道,比如 https://stats.nba.com/player/977/ 就是对应着科比的介绍!

# 爬数据
years = [1996, 2012]# 球员职业生涯时间
player_id = '977'# 球员ID
shot_data(years,player_id)# 可视化投篮图
draw_shot('977')

来感受下进攻万花筒,有很多负角度的


老科,因为他才看了解,喜欢上 NBA的!最早看到蜗壳应该是读小学的时候,同桌柳某的软面抄封面就是 bryant!

5 Others

1)James Harden

# 爬数据
years = [2017, 2019]# 球员职业生涯时间
player_id = '201935'# 球员ID
shot_data(years,player_id)# 可视化投篮图
draw_shot(player_id)



夜店小王子改邪归正后,没的说,西科东艾北卡南麦四大天王之后,第一分位实至名归(能突能投,欧洲步要哨,后撤步三分都是无解的)!

2)Lebron James

# 爬数据
years = [2017, 2019]# 球员职业生涯时间
player_id = '2544'# 球员ID
shot_data(years,player_id)# 可视化投篮图
draw_shot(player_id)


老詹还是老詹,全能王,推土机,这是一位哪怕在“敌方阵营”也会让你肃然起敬的球员!
想当初,交易到 Lakers ,我还在朋友圈庆祝我湖终于可以进季后赛了……希望今年能和浓眉哥擦出火花,重返紫金荣耀!


3) Giannis Antetokounmpo

字母哥,这就是个怪兽……期待他的成长!

4) Kevin Durant

我还是非常喜欢阿杜的,哈哈,早些年 Kobe 带队打世界级的比赛时,总把阿杜和龙王波什弄混了,哈哈哈,一样的……

阿杜在勇士的 2 个FMVP没得说,配得上“死神”的称号!只希望伤病不会对阿杜造成太大影响,希望他能在球场上多闪耀几个年华!(中距离跳投无解)

5)Joel Embiid

大帝有三分,而西帝没有,这是最骚的!

6)Ben Simmons

来看看西帝

哈哈哈,这个定妆照……有点毁形象哈,丢几张图感受一下!



实话说,他“女友”是卡戴珊家族中,比较符合东方审美的一位佳丽,哈哈,不知道这么措辞准不准确!

7)Clint Capela

饼皇

8)Draymond Green

3D

【python】Visualization of field data(NBA)相关推荐

  1. 【Python】pathlib 模块的用法(Path)

    [Python]pathlib 模块的用法 文章目录 [Python]pathlib 模块的用法 1. 介绍 2. 举例 2.1 获取目录 2.2 目录拼接 2.3 创建.删除目录 2.4 读写文件 ...

  2. python基础知心得总结_【python】基础学习心得总结(一)

    本文将简单阐述一些基本的python知识点,大多是本人在学习过程中的心得体会.简单常用的编程概念和思想将不再描述.若有理解错误,还望指正. 一.python运行,调试 python和相关软件可以在官网 ...

  3. python界面设计实例-【Python】Tkinter图形界面设计(GUI)

    简介 作为 Python 开发者,图形用户界面(GUI)开发是必备技能之一.目前,市面上支持 Python 的"GUI 工具包"很多,各有特点,虽然大多数工具包的基础类似,但要学习 ...

  4. 【Python】Tkinter图形界面设计(GUI)

    简介 作为 Python 开发者,图形用户界面(GUI)开发是必备技能之一.目前,市面上支持 Python 的"GUI 工具包"很多,各有特点,虽然大多数工具包的基础类似,但要学习 ...

  5. 【Python】用蒙特卡洛树搜索(MCTS)解决寻路问题

    像人类一样思考. 文章目录 用蒙特卡洛树搜索(MCTS)解决寻路问题 关于蒙特卡洛树搜索 寻路问题和寻路算法 数据结构与定义 寻路算法的基本假设 权值计算 改进后的权值存储和加权随机策略 测试运行 结 ...

  6. 【Python】Matplotlib中的annotate(注解)【转载】

    原文链接:https://www.cnblogs.com/dqi1999/articles/14004235.html 官方文档:https://matplotlib.org/api/_as_gen/ ...

  7. 【Python】学习笔记总结6(正则表达式)

    文章目录 六.Python正则表达式 1.re模块 2.匹配规则-字符 2.1`.`的使用 2.2`[]`的使用 2.3`\d`的使用 2.4`\D`的使用 2.5`\s`的使用 2.6`\S`的使用 ...

  8. 【ZED】从零开始使用ZED相机(五):Opencv+Python实现相机标定(双目)

    引言 同样Opencv+Python实现双目相机的标定,单目标定详见[ZED]从零开始使用ZED相机(五):Opencv+Python实现相机标定(单目) 1 cv2.stereoCalibrate ...

  9. 【爬虫】scrapy下载股票列表(四)——对接mongodb保存数据

    本文是本项目最后一篇,撒花! 前三篇传送门: [爬虫]scrapy下载股票列表(一)--对接selenium中间件: https://blog.csdn.net/yao09605/article/de ...

最新文章

  1. 【连载】优秀程序员的 45 个习惯之习惯27
  2. 超图使用服务管理页面发布服务图解
  3. javaI/O之PushbackInputStream
  4. opencv 轮廓放大_基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析...
  5. Apache HTTP服务器 2.0版本文档
  6. qt 右键显示设置界面 后台运行_1.1安装Qt
  7. python逻辑判断_return逻辑判断表达式
  8. 深度学习9-tensorboard
  9. 【游戏】基于matlab GUI可调电扇设计【含Matlab源码 1110期】
  10. java 阿拉伯数字日期转换为中文大写日期方法_日期转换为中文大写数字
  11. mysql 共享锁(读写锁) 修改数据问题(update,insert)(LOCK IN SHARE MODE)
  12. Sql代码美化工具:Sql Pretty Printer for SSMS V3.6.1
  13. SQL编程和高级查询
  14. 谷歌浏览器mac切换标签快捷键
  15. mysql查询排序(asc,desc)
  16. STATA 和 SAS 输入输出示范
  17. ping命令的多种玩法,以前竟然只用它来测试网速!
  18. MySQL入门学习之——MySQL Cluster初体验
  19. 中国电信光猫路由模式端口映射问题记录
  20. ARM学习(12)基于arm架构的嵌入式操作系统理解

热门文章

  1. css3案例分析,王安琪:CSS3网站案例分析——以“Fine Goods”为例
  2. 计算机组成原理VHDL语言实现16位ALU实验
  3. C# / VB / LabVIEW / VC / Python 上位机使用S7-TCP协议与西门子PLC进行网口通信的教程 (Win/Linux)
  4. 289页初中级前端题助你拿下Offer,0基础学前端开发
  5. C# 公共控件之maskedTextBox
  6. 简析:阿里巴巴最近20个月的拆分史
  7. Cookie同名不覆盖问题
  8. android+多处理器+ios,ios与安卓的区别 浅谈ios为什么比安卓流畅 (2)
  9. Linux基础入门练习题
  10. 字节跳动大佬全新开源:Python数据分析实例,建议收藏!