NBA数据可视化

2025-08-23 07:41:23

第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)球员idptsdouble场均得分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)球员idwsdouble场均得分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()

中超本土球员赛季十佳球技术拆解
科研成果