python柱状图、直方图和饼状图统计学生成绩

Python的matplotlib库具有很强大的绘图功能,可以利用这个库函数来进行学生成绩统计。假如有一个班的某科学生成绩如表1所示,可以用柱状图、直方图和饼状图三种方式来进行统计分析。下边介绍一下操作步骤。

表1 学生成绩表

学号

分数

20221001

61

20221002

68

20221003

74

20221004

70

20221005

53

20221006

66

20221007

66

20221008

71

20221009

67

20221010

84

20221011

79

20221012

73

20221013

64

20221014

90

20221015

81

20221016

82

20221017

77

20221018

51

20221019

78

20221020

75

20221021

69

20221022

83

20221023

56

20221024

73

20221025

93

20221026

63

20221027

80

20221028

76

20221029

80

20221030

74

20221031

72

20221032

88

20221033

62

20221034

85

20221035

86

20221036

58

20221037

72

20221038

72

20221039

70

20221040

91

目录

一、把成绩表转成csv格式

二、统计分析的方法

1、柱状图

2、直方图

3、饼状图

三、实现代码

四、实现效果


一、把成绩表转成csv格式

学号用字段“No.”表示,成绩用“score”,表格名称为“score”。

表2 成绩表转化为csv格式
No.score
2022100161
2022100268
2022100374
2022100470
2022100553
2022100666
2022100766
2022100871
2022100967
2022101084
2022101179
2022101273
2022101364
2022101490
2022101581
2022101682
2022101777
2022101851
2022101978
2022102075
2022102169
2022102283
2022102356
2022102473
2022102593
2022102663
2022102780
2022102876
2022102980
2022103074
2022103172
2022103288
2022103362
2022103485
2022103586
2022103658
2022103772
2022103872
2022103970
2022104091

二、统计分析的方法

在课程成绩情况统计分析时,可以选则柱状图、直方图和饼状图三种图形。

1、柱状图

使用柱状图分析全班平均分数、最高分数和最低分数。

2、直方图

使用直方图和正态分布曲线分析全班成绩的正态分布情况。

3、饼状图

使用饼状图分析60分以下、60-70分、70-80分、80-90分和90分以上几个分数区间的人数所占比例。

三、实现代码

import pandas as pd  # 引入panda工具集
import numpy as np  # 引入numpy核心库
import matplotlib.pyplot as plt  #引入matplotlib数据可视化库

#声明变量
a=0     #90分以上数量
b=0     #80-90分以上数量
c=0     #70-80分以上数量
d=0     #60-70分以上数量
e=0     #60分以下数量
score_max=0
score_min=100
score_avg=0
score_sum=0

# 正态分布的概率密度函数
#   x      数据集中的某一具体测量值
#   mu     数据集的平均值,反映测量值分布的集中趋势
#   sigma  数据集的标准差,反映测量值分布的分散程度
def normfun(x, mu, sigma):
    pdf = np.exp(-((x - mu) ** 2) / (2 * sigma ** 2)) / (sigma * np.sqrt(2 * np.pi))
    return pdf

if __name__ == '__main__':
    
    data = pd.read_csv('score.csv') # 载入分数数据文件
    score = data['score'] # 获得分数数据集
    student_no = data['No.'] # 获得学号数据集
    mean = score.mean() # 获得分数数据集的平均值
    std = score.std()   # 获得分数数据集的标准差

   #计算分数总和、各分数区间数量统计
    for i in range(0,len(score)):
        score0=int(score[i])
                
        #print(student_no[i],score0)
        score_sum=score_sum+score0  #计算分数之和,为求平均数做准备

        #计算最大值
        if score0>score_max:
            score_max=score0

        #计算最小值
        if score0<score_min:
            score_min=score0

        
        if score0>=90:              #统计90分以上数量
            a=a+1
        elif score0>=80:            #统计80分以上数量
            b=b+1
        elif score0>=70:            #统计70分以上数量
            c=c+1
        elif score0>=60:            #统计60分以上数量
            d=d+1
        else:                       #统计60分以下数量
            e=e+1

    score_avg=score_sum/len(score)  #平均分
    scores=[a,b,c,d,e]              #分数区间统计
    
    

    # 柱形图柱形的宽度
    bar_width = 0.3
    

    # 设定X轴:前两个数字是x轴的起止范围,第三个数字表示步长,步长设定得越小,画出来的正态分布曲线越平滑
    x = np.arange(0, 100, 1)

    # 设定Y轴,正态分布函数
    y = normfun(x, mean, std)

    # 设定柱状图x轴、Y轴数组
    x3 = np.arange(3)
    y3 = np.array([score_avg,score_max,score_min])
    

    # 绘制分数数据集的正态分布曲线和直方图(5分档)
    plt.subplot(221)
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.title('分数分布(5档)')
    plt.plot(x, y)
    plt.hist(score, bins=5, rwidth=0.9, density=True)
    plt.xlabel('分数')
    plt.ylabel('概率')
    

    # 绘制分数数据集的正态分布曲线和直方图(10分档)
    plt.subplot(222)
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.title('分数分布(10档)')
    plt.plot(x, y)   
    plt.hist(score, bins=10, rwidth=0.9, density=True)
    plt.xlabel('分数')
    plt.ylabel('概论')


    # 绘制柱形图
    plt.subplot(223)
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.title('分数统计')
    plt.bar(x3, y3, tick_label=['平均分', '最高分', '最低分'], width=bar_width)

    # 绘制饼状图
    plt.subplot(224)
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.title('分数段饼图')
    plt.pie(scores,labels=['90分以上','80-90分','70-80分','60-70分','60分以下'])
    # 输出四幅图
plt.show()

四、实现效果

(全文结束)

 

  • 9
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值