NBA数据可视化

本文介绍了如何使用Python和Matplotlib库从MySQL数据库中提取NBA球员的相关数据,包括国籍分布、得分频率、胜率和趋势,并分别用饼图、频率直方图、条形图和折线图进行可视化,结果保存至指定路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第1关:NBA球员国籍可视化

编程要求

读取 MySQL 中 result.nba_country表内球员数量大于5的数据,用来绘制 NBA 国籍分布图,最终将绘制的图片保存到指定路径中。

具体要求如下:

  • 设置饼图的figsize(15, 10)

  • 标签名称为读取的国籍名;

  • 主标题设置为:NBA 国籍分布图;

  • 设置占比最高的科目离心点距离为:0.2,其余的设为0.7

  • 添加数值,精确到小数点后两位,如:20.52%

  • 文件保存路径为/data/workspace/myshixun/step1/image/user.png

nba_country 表结构如下:

字段类型含义
countryvarchar(50)国籍
countint(5)球员数量

MySQL 数据库连接信息

账号: root 密码:123123 地址:127.0.0.1 端口:3306

from matplotlib import pyplot as plt
import pymysql


def work():
    ##################### Begin #####################
    # 设置中文显示
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 设置图片大小
    plt.figure(figsize=(15,10))
    # 获取 mysql 中的数据
    conn = pymysql.connect(host='127.0.0.1',
        user='root',
        password='123123',
        port=3306,
        database='result') # 建立连接
    cursor = conn.cursor()
    # 获取数据
    cursor.execute("select * from nba_country where count>5") 
    list_res = cursor.fetchall() 
    # 关闭连接
    conn.close()
    cursor.close()
    # 定义存放数据的列表
    list_name = []  # 国籍
    list_data = []  # 数值
    # 添加数据
    for data in list_res:
        list_name.append(data[0])
        list_data.append(data[1])
    # 设置离心点,找出最大的占比下标
    maxNum = max(list_data)  # 找出最大值
    index = []  # 记录下标
    # 需要循环寻找最大值坐标,因为可能有多个最大值
    for i in range(0, len(list_data)):
        if list_data[i] == maxNum:
            index.append(i)
    # 设置所有的离心点距离
    explode = [0.7 for _ in range(0, len(list_data))]
    # 设置最大值的离心点距离
    for i in range(0, len(index)):
        explode[index[i]] = 0.2
    # 添加标题
    plt.title("NBA 国籍分布图")
    # 绘制饼图
    plt.pie(list_data,labels=list_name,autopct='%1.2f%%',explode=explode)
    # 保存图片
    plt.savefig('/data/workspace/myshixun/step1/image/user.png')
    ##################### End #####################
work()

第2关:NBA球员得分可视化

编程要求

读取 MySQL 中 result.nba_pts表内所有得分数据,用来绘制频率分布图,最终将绘制的图片保存到指定路径中。

具体要求如下:

  • 设置制频率分布图的figsize(15, 10)

  • 竖轴标签为;"得分";

  • 图形颜色为:#f0a1a8

  • 主标题设置为:球员得分频率分布图;

  • 设置网格,透明度为:0.3,线条类型为::

  • 文件保存路径为/data/workspace/myshixun/step2/image/user.png

nba_pts 表结构如下:

字段类型含义
player_namevarchar(50)球员id
ptsdouble场均得分
countryvarchar(20)国籍

MySQL 数据库连接信息

账号: root 密码:123123 地址:127.0.0.1 端口:3306

from matplotlib import pyplot as plt
import pymysql


def work():
    ##################### Begin #####################
    # 设置中文显示
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 设置图片大小
    plt.figure(figsize=(15,10))
    # 获取 mysql 中的数据
    conn = pymysql.connect(host='127.0.0.1',user='root',password='123123',port=3306,database='result') # 建立连接
    cursor = conn.cursor()    
    # 获取数据
    cursor.execute("select pts from nba_pts")
    list_data = cursor.fetchall()
    # 关闭连接
    conn.close()
    cursor.close()
    # 定义存放数据的列表
    list_score = []  # 球员得分
    # 添加数据
    for data in list_data:
        list_score.append(data[0])
    # 绘制频率直方图
    plt.hist(list_score, color='#f0a1a8', bins=20)
    # 设置网格
    plt.grid(alpha=0.3, linestyle=':')
    # 竖轴标签
    plt.ylabel("得分")
    # 添加标题
    plt.title("球员得分频率分布图")
    # 设置保存路径
    plt.savefig("/data/workspace/myshixun/step2/image/user.png")
    ##################### End #####################
work()

第3关:NBA球员胜率可视化

编程要求

读取 MySQL 中 result.nba_ws表内所有工作年份在 19 年或以上的数据,用来绘制条形图,最终将绘制的图片保存到指定路径中。

具体要求如下:

  • 设置条形图的figsize(15, 10)

  • 竖轴标签为;"胜率";

  • 条形图颜色为:#ed556a,宽度为:0.4

  • 主标题设置为:NBA 球员胜率图;

  • 设置网格,透明度为:0.3,线条类型为:-,线条宽度为:0.2,颜色为:gray

  • 设置横轴标签倾斜度为:-30

  • 将球员姓名作为横轴数据,胜率作为竖轴数据;

  • 文件保存路径为/data/workspace/myshixun/step3/image/user.png

result.nba_ws 表结构如下:

字段类型含义
player_namevarchar(50)球员id
wsdouble场均得分
work_yearvarchar(20)经验/工作年份

MySQL 数据库连接信息

账号: root 密码:123123 地址:127.0.0.1 端口:3306

from matplotlib import pyplot as plt
import pymysql


def work():
    ##################### Begin #####################
    # 设置中文显示
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 设置图片大小
    plt.figure(figsize=(15,10))
    # 获取 mysql 中的数据
    conn = pymysql.connect(host='127.0.0.1',user='root',password='123123',port=3306,database='result') # 建立连接
    cursor = conn.cursor()
    # 获取数据
    cursor.execute("select player_name,ws from nba_ws where work_year>='19'") 
    list_data = cursor.fetchall()  
    # 关闭连接
    conn.close()
    cursor.close()
    # 存放数据
    list_ws = []  # 球员胜率
    list_name = []  # 球员姓名
    # 添加数据
    for data in list_data:
        list_name.append(data[0])
        list_ws.append(data[1])
    # 数值排序
    sorted_indices = sorted(range(len(list_ws)), key=lambda k: list_ws[k])
    # 绘制条形图
    plt.bar(range(len(list_ws)), [list_ws[i] for i in sorted_indices], color='#ed556a', width=0.4)
    # 添加标签
    plt.xticks(range(len(list_ws)), [list_name[i] for i in sorted_indices])
    # 添加竖轴标签
    plt.ylabel("胜率")
    # 设置横轴标签倾斜度
    plt.xticks(rotation=-30, ha='left')
    # 设置网格线
    plt.grid(alpha=0.3, linestyle='-', linewidth=0.2, color='gray')
    # 保存图片
    plt.savefig("/data/workspace/myshixun/step3/image/user.png")
    ##################### End #####################
work()

第4关:NBA球员球队可视化

编程要求

读取 MySQL 中 result.nba_cs表内所有数据,用来绘制散点图,最终将绘制的图片保存到指定路径中。

具体要求如下:

  • 设置制散点图的figsize(10, 8)

  • 先将数据根据综合实力进行倒序排列,取综合实力前 25 的数据设置为散点图数据一(以下称为:图一),将综合实力后 25 的数据设置为散点图数据二(以下称为:图二)。

  • 竖轴标签为;"综合实力";

  • 图一的颜色为: red,图形设为三角形,大小设置为:60,标签设置为:Top25

  • 图二的颜色为: blue,图形设为圆形,大小设置为:60,标签设置为:Top50

  • 主标题设置为:NBA 球队胜率 Top50;

  • 设置网格,透明度为:0.3,线条类型为::,线条宽度为:0.2,颜色为:gray

  • 设置图例,位置为:best

  • 文件保存路径为/data/workspace/myshixun/step4/image/user.png

result.nba_cs 表结构如下:

字段类型含义
team_namevarchar(50)球队名称
csdouble综合实力

MySQL 数据库连接信息

账号: root 密码:123123 地址:127.0.0.1 端口:3306

from matplotlib import pyplot as plt
import pymysql


def work():
    ##################### Begin #####################
    # 设置中文显示
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 设置图片大小
    plt.figure(figsize=(10,8))
    # 获取 mysql 中的数据
    conn = pymysql.connect(host='127.0.0.1',user='root',password='123123',port=3306,database='result') # 建立连接
    cursor = conn.cursor()
    # 获取数据
    cursor.execute("select team_name,cs from nba_cs order by cs desc")
    list_data = cursor.fetchall()
    # 关闭连接
    conn.close()
    cursor.close()
    # 存放数据
    list_cs = []  # 综合实力
    list_teamName = []  # 球队名称
    # 添加数据
    for data in list_data:
        list_teamName.append(data[0])
        list_cs.append(data[1])
    # 绘制图一
    plt.scatter(list_teamName[:25], list_cs[:25], color='red', marker='^', s=60, label='Top25')
    # 绘制图二
    plt.scatter(list_teamName[-25:], list_cs[-25:], color='blue', marker='o', s=60, label='Top50')
    # 设置网格线
    plt.grid(alpha=0.3, linestyle=':', linewidth=0.2, color='gray')
    # 设置竖轴标签
    plt.ylabel("综合实力")
    # 设置主标题
    plt.title("NBA 球队胜率 Top50")
    # 设置图例
    plt.legend(loc='best')
    # 保存图片
    plt.savefig("/data/workspace/myshixun/step4/image/user.png")
    ##################### End #####################
work()

第5关:NBA球员趋势可视化

编程要求

读取 MySQL 中 result.nba_year表内所有数据,用来绘制折线图,最终将绘制的图片保存到指定路径中。

具体要求如下:

  • 设置制散点图的figsize(15,15)

  • 按照年份升序排列绘制。

  • 竖轴标签为;"人数";

  • 主标题设置为:NBA 球员趋势图;

  • 折线图颜色为:#2775b6,线条样式为:--

  • 设置横轴跨度为:2,标签倾斜度为:-45

  • 设置网格,透明度为:0.3,线条类型为::,线条宽度为:0.2,颜色为:red

  • 文件保存路径为/data/workspace/myshixun/step5/image/user.png

result.nba_year 表结构如下:

字段类型含义
yearint(5)年份
countint(5)数量

MySQL 数据库连接信息

账号: root 密码:123123 地址:127.0.0.1 端口:3306

from matplotlib import pyplot as plt
import pymysql


def work():
    ##################### Begin #####################
    # 设置中文显示
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 设置图片大小
    plt.figure(figsize=(15,15))
    # 获取 mysql 中的数据
    conn = pymysql.connect(host='127.0.0.1',user='root',password='123123',port=3306,database='result') # 建立连接
    cursor = conn.cursor() 
    # 获取数据
    cursor.execute("select year,count from nba_year order by year desc") 
    list_data = cursor.fetchall() 
    # 关闭连接
    conn.close()
    cursor.close()
    # 定义存放数据的列表
    list_year = []  # 年份
    list_count = []  # 球员数量
    # 添加数据
    for data in list_data:
        list_year.append(data[0])
        list_count.append(data[1])
    # 绘制折线图
    plt.plot(list_year, list_count, color='#2775b6', linestyle='--')
    # 设置网格线
    plt.grid(alpha=0.3, linestyle=':', linewidth=0.2, color='red')
    # 设置竖轴
    plt.ylabel("人数")
    # 设置主标题
    plt.title("NBA 球员趋势图")
    # 设置横轴跨度和标签倾斜度
    plt.xticks(range(len(list_year)), list_year, rotation=-45)
    # 保存图片
    plt.savefig("/data/workspace/myshixun/step5/image/user.png")
    ##################### End #####################
work()

基于Python的NBA数据可视化分析系统是一种利用Python的强大数据分析工具和库(如Pandas、Matplotlib、Seaborn等),对NBA比赛相关的统计数据进行提取、处理、建模并生成直观图表的应用程序或脚本集合。 以下是该系统的典型功能及步骤: ### 功能模块 1. **数据获取** - 可以通过公开API(例如nba_api Python包)、爬虫技术从官网或其他网站抓取历史赛程、球员表现、球队排名等相关信息。 2. **数据清洗与预处理** 使用`pandas.DataFrame`结构加载原始CSV文件或者JSON响应内容,并完成缺失值填补、异常检测以及统一字段格式等工作,保证后续计算结果准确可靠。 3. **统计计算** 针对自己关心的角度展开深入探索式研究。比如某位球星职业生涯平均得分趋势图;比较两支队伍之间的胜负场次分布情况等等复杂运算任务都可以借助NumPy高效数组操作来实现。 4. **交互式绘图展示** 利用matplotlib/seaborn制作精美的二维图形界面表达关键发现点,同时也可以尝试plotly这样的第三方扩展插件支持动态三维视图效果更佳! 5. **预测模型构建**(选做) 如果还想进一步挖掘潜在规律,则可以引入机器学习算法,建立回归方程评估未来赛季冠军归属可能性大小等问题。 --- ### 示例项目流程 假设我们想了解“过去十年里谁是最稳定的关键先生?”这个问题的答案。 #### 步骤一:收集所需资源 首先确定目标范围内的所有常规赛后半段关键时刻投篮记录表单链接地址列表,然后编写简单的网络请求函数批量下载对应网页源码保存至本地磁盘等待下一步解析动作发生即可。 ```python import requests from bs4 import BeautifulSoup as soup # 省略其他非必要代码... ``` #### 步骤二:整理基础资料 接着运用正则表达式匹配规则抽取出每行有效数字项组合成易于管理的数据集形式供接下来阶段继续加工改造之需所用之处也无妨啦~ ```python import re pattern = r'\d+' # 匹配任意长度连续整数字符串模式对象实例化构造过程省略不计哈~ matches = pattern.findall(html_content) data_list.append([int(m.group()) for m in matches]) df = pd.DataFrame(data=data_list,columns=["Year","TeamA_Score",...]) # 更多列名补全工作自行补充完整吧:) ``` 最后再按照个人喜好选择合适的样式主题定制个性化外观呈现给用户观看欣赏便大功告成了呢😄
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值