【python数据可视化】成绩分析及可视化实例

题目要求

综合项目设计2:成绩分析及可视化实例
【已有功能】某班有30名学生的3门课程成绩,请统计每个学生课程的总分、平均分,每门课程的最高分、最低分,并绘制图形,对比各成绩段的成绩人数分布。
【教学目标】强化numpy和matplotlib的应用能力,numpy读取csv。
【已有代码】
#成绩分析及可视化实例
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
matplotlib.rcParams['font.family'] = 'SimHei'
stuScore = np.loadtxt('student_score.csv',delimiter = ',')#读入成绩文件,返回数组
sumEach = np.sum(stuScore[:,1:],axis = 1)#返回每个学生3门课程总分
avgEach = np.average(stuScore[:,1:],axis = 0)#返回每个学生每门课程平均分
#返回最高分和最低分
maxMath = np.max(stuScore[:,1])
maxEng = np.max(stuScore[:,2])
maxPython = np.max(stuScore[:,3])
minMath = np.min(stuScore[:,1])
minEng = np.min(stuScore[:,2])
minPython = np.min(stuScore[:,3])

print("个人总分情况是:")
print(sumEach)
print("个人平均分情况是:")
print(avgEach)
print("班级每门课程最高分:")
print(maxMath,maxEng,maxPython)
print("班级每门课程最低分:")
print(minMath,minEng,minPython)
#取出各科成绩
mathScore = stuScore[:,1]   
engScore = stuScore[:,2]
pythonScore = stuScore[:,3]
#绘制高数直方图
plt.suptitle("成绩分布直方图")
plt.subplot(3,1,1)
plt.hist(mathScore,bins=10,range=(0,100),color='red')# 0-100分,分成10段
plt.xlabel("高数成绩分数段")#设置x轴标签
plt.ylabel("人数")#设置y轴标签
plt.xlim(0,100)#设置x轴区间
plt.ylim(0,20)#设置y轴区间
plt.xticks([0,10,20,30,40,50,60,70,80,90,100])#设置x轴刻度
plt.yticks([0,5,10,15,20]) #设置y轴刻度
plt.grid()
#绘制英语直方图
plt.subplot(3,1,2)
plt.hist(engScore,bins=10,range=(0,100),color='blue')#0-100分,分成10段
plt.xlabel("英语成绩分数段")#设置x轴标签
plt.ylabel("人数")#设置y轴标签
plt.xlim(0,100)#设置x轴区间
plt.ylim(0,20)#设置y轴区间
plt.xticks([0,10,20,30,40,50,60,70,80,90,100])#设置x轴刻度
plt.yticks([0,5,10,15,20]) #设置y轴刻度
plt.grid()
#绘制python直方图
plt.suptitle("成绩分布直方图")
plt.subplot(3,1,3)
plt.hist(pythonScore,bins=10,range=(0,100),color='green')#0-100分,分成10段
plt.xlabel("Python成绩分数段")#设置x轴标签
plt.ylabel("人数")#设置y轴标签
plt.xlim(50,100)#设置x轴区间
plt.ylim(0,20)#设置y轴区间
plt.xticks([50,60,70,80,90,100])#设置x轴刻度
plt.yticks([0,5,10,15,20]) #设置y轴刻度
plt.grid()
plt.show()        

项目修改与设计说明:
(1)绘制三门课程平均分的柱状图对比;(2)绘制python课程各成绩段人数的饼图;

实现代码

#成绩分析及可视化实例
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
matplotlib.rcParams['font.family'] = 'SimHei'
stuScore = np.loadtxt('student_score.csv',delimiter = ',')#读入成绩文件,返回数组
sumEach = np.sum(stuScore[:,1:],axis = 1)#返回每个学生3门课程总分
avgEach = np.average(stuScore[:,1:],axis = 0)#返回每个学生每门课程平均分
#返回最高分和最低分
maxMath = np.max(stuScore[:,1])
maxEng = np.max(stuScore[:,2])
maxPython = np.max(stuScore[:,3])
minMath = np.min(stuScore[:,1])
minEng = np.min(stuScore[:,2])
minPython = np.min(stuScore[:,3])
print(avgEach)
print("个人总分情况是:")
print(sumEach)
print("个人平均分情况是:")
print(avgEach)
print("班级每门课程最高分:")
print(maxMath,maxEng,maxPython)
print("班级每门课程最低分:")
print(minMath,minEng,minPython)
#取出各科成绩
mathScore = stuScore[:,1]
engScore = stuScore[:,2]
pythonScore = stuScore[:,3]

bar = plt.subplot(1,2,1)
x=['高数','英语','python']
plt.bar(x,avgEach)
plt.yticks([10,20,30,40,50,60,70,80,90,100]) #设置y轴刻度
#plt.show()


##
a=0
b=0
c=0
d=0
e=0
list1=[]
for row in stuScore:
    list1.append(row[3])
    if(row[3]<60):
        e=e+1
    if(60<=row[3]and row[3]<70):
        d=d+1
    if(70<=row[3]and row[3]<80):
        c=c+1
    if(80<=row[3]and row[3]<90):
        b=b+1
    if(90<=row[3]):
        a=a+1
# 构造数据
edu = [a/30,b/30,c/30,d/30,e/30]
labels = ['优秀','良', '中','及格','不及格']

explode = [0.1,0,0,0,0]  
colors=['#9999ff','#ff9999','#7777aa','#2442aa','#dd5555'] # 自定义颜色

# 中文乱码和坐标轴负号的处理
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

# 将横、纵坐标轴标准化处理,保证饼图是一个正圆,否则为椭圆
plt.axes(aspect='equal')

# 控制x轴和y轴的范围
plt.xlim(0,4)
plt.ylim(0,4)
pei = plt.subplot(1,2,2)
# 绘制饼图
plt.pie(x = edu, # 绘图数据
        explode=explode, 
        labels=labels, # 添加教育水平标签
        colors=colors, # 设置饼图的自定义填充色
        autopct='%.1f%%', # 设置百分比的格式,这里保留一位小数
        pctdistance=0.8,  # 设置百分比标签与圆心的距离
        labeldistance = 1.15, # 设置教育水平标签与圆心的距离
        startangle = 180, # 设置饼图的初始角度
        radius = 1.5, # 设置饼图的半径
        counterclock = False, # 是否逆时针,这里设置为顺时针方向
        wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'},# 设置饼图内外边界的属性值
        textprops = {'fontsize':12, 'color':'k'}, # 设置文本标签的属性值
        center = (1.8,1.8), # 设置饼图的原点
        frame = 0 )# 是否显示饼图的图框,这里设置显示

# 删除x轴和y轴的刻度
plt.xticks(())
plt.yticks(())
# 添加图标题

#plt.subplots_adjust(left=0.1, top=0.88, right=0.2, bottom=0.08, wspace=0.02, hspace=0.02)
plt.show()
# 显示图形

代码运行截图:

在这里插入图片描述
在这里插入图片描述


原文连接:https://blog.csdn.net/weixin_52908342/article/details/121926347

相关推荐

Flask框架——消息闪现

34个图片压缩工具集合,包含在线压缩和CLI工具

入门即享受!coolbpf 硬核提升 BPF 开发效率 | 龙蜥技术

基于 OPLG 从 0 到 1 构建统一可观测平台实践

全链路灰度在数据库上我们是怎么做的?

冴羽答读者问:过程比结果重要吗?如果是,怎么理解?如果不是,又怎么解?

接口文档管理工具,选yapi 还是 Apifox? 这里列出了两款软件的深度分析,看完再下载不迟。

基于 Docker 来部署 Vue 或 React 前端项目及 Node 后端服务

三十岁的我,自由了!

如何实现带timeout的input?

统计千行代码Bug率,有没有意义?

814. 二叉树剪枝 : 简单递归运用题

【综合笔试题】难度 3.5\u002F5,多解法热门二叉树笔试题

为什么设计的软件不好用?那是因为不熟悉软件开发模型!一文熟悉软件开发模型

作为前端,我是这样从零实现CI\u002FCD二(node服务部署及前后端联调)

极智开发 | 讲解 Nginx 特性之一:反向代理

Netty 案例之 IM 方案设计

从 Google 离职,前Go 语言负责人跳槽小公司

最终一致性性分布式事务 TCC

不谈源码,聊聊位运算的实际应用