作业 使用雷达图对学生数据进行分析

题目:基于给定的学生成绩数据完成以下任务(scores.csv):

  1. 程序运行时用户可以输入要进行成绩分析的学生的姓名;
  2. 通过雷达图分析用户输入的学生各门课程的成绩;
  3. 在雷达图中增加各门课程平均分的分布情况;
  4. 构建图例对不同数据进行说明;
  5. 依据雷达图的显示结果,对所查询学生的课程成绩的分布情况进行简要分析。

① 代码:

import numpy as np
import matplotlib.pyplot as plt
import csv

name = input("请输入学生姓名:")
# 以张三为例

# 设置字体,防止中文乱码
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = [u'SimHei']

# 处理数据:
score = []    
with open('scores.csv', 'r') as f:
    # 创建一个csv.reader对象,用于读取f中的数据
    reader = csv.reader(f)
    # 获取csv文件的第一行数据(表头)
    head = next(reader)
    # head:['Name', '高数', '英语', 'Python', '音乐', '物理', '化学', '体育']
    data_length = len(head) - 1
    flag = False
    for data in reader:
        # data: ['张三', '88', '64', '96', '85', '90', '81', '95']
        # print(data)
        if name == str(data[0]):
            score.append(data[1:])
            flag = True
    if not flag:
        print("学生不存在!")
        exit(0)  # 退出程序,返回状态码0
    # print(score)
# 将二维列表中每个字符串类型的元素转换为整数类型。
score = [[int(x) for x in sc] for sc in score]
print(name + "的成绩如下:")
print(score)

# 平均分:
score_avg = [89.5, 87, 93.8, 88.5, 88, 90.8, 85, 89.5]
print("平均分:")
print(score_avg)

# 图像配置准备:
# 将极坐标根据数据长度进行等分
angles = np.linspace(0, 2*np.pi, data_length, endpoint=False)
# 设置雷达图中的标签,去掉Name
labels = head[1:]
# print(labels)
# ['大学英语', '高等数学', '体育', '计算机基础', '程序设计']
# 使雷达图数据封闭,将第一个值添加到列表最后,以实现x闭合
stu_score = np.concatenate((score[0], [score[0][0]]))
# print(stu_score)
# stu_score: ['88' '64' '96' '85' '90' '81' '95' '88']
# 同理,将角度和标签闭合
angles = np.concatenate((angles, [angles[0]]))
labels = np.concatenate((labels, [labels[0]]))

# 画图:
# 设置图形的大小
fig = plt.figure(figsize=(8, 6), dpi=100)
# 新建一个子图
ax = plt.subplot(111, polar=True)
# 绘制雷达图
ax.plot(angles, stu_score, color='g')
ax.plot(angles, score_avg, color='r')
# 设置雷达图中每一项的标签显示
ax.set_thetagrids(angles*180/np.pi, labels)
# 设置雷达图的0度起始位置
ax.set_theta_zero_location('N')
# 设置雷达图的坐标刻度范围
ax.set_rlim(0, 100)
# 设置雷达图的坐标值显示角度,相对于起始角度的偏移量
ax.set_rlabel_position(270)
ax.set_title("大一部分课程成绩")
plt.legend([name, "平均分"], loc='best')
plt.show()

 

运行结果截图:

·张三:

·李明:

·王五:

·刘敏佳:

·马欣宇:

·孙文硕:

·当学生不存在时:

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值