成绩分析图

2018年,某中学高二1班、高二2班、高二3班进行第一次模拟考试后,教师对此次考试成绩进行录入处理,并求出各个班级中语文、数学、英语、物理、化学和生物的平均成绩,归纳后如下表所示:


画出折线图,条形图,雷达图,步阶图等至少四种展示方式

代码:

import matplotlib.pyplot as plt
import numpy as np

classes = ['高二1班', '高二2班', '高二3班']
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置显示中文字体
plt.rcParams['axes.unicode_minus'] = False # 设置正常显示符号
subjects = np.array(['语文','数学','英语','物理','化学','生物'] )
scores = {
    '高二1班': [95, 96, 85, 63, 91, 86],
    '高二2班': [75, 93, 66, 85, 88, 76],
    '高二3班': [86, 76, 96, 93, 67, 87]
}

average_scores = {cls: np.mean(scores[cls]) for cls in classes}

plt.figure(figsize=(10, 6))
bar_width = 0.2
index = np.arange(len(subjects))
for i, class_name in enumerate(classes):
    plt.bar(index + i * bar_width, [scores[class_name][j] for j in range(len(subjects))], width=bar_width, label=class_name, color='white', edgecolor='black')

plt.title('各班级各学科平均成绩步阶图')
plt.xlabel('科目')
plt.ylabel('累积平均成绩')

plt.xticks(index + bar_width, subjects)

plt.legend()

plt.show()



#条形图
fig, ax = plt.subplots(figsize=(10, 6))

bar_width = 0.2
index = np.arange(len(subjects))

for i, class_name in enumerate(classes):
    scores_per_subject = scores[class_name]
    ax.bar([p + bar_width * i for p in index], scores_per_subject, width=bar_width, label=class_name)

plt.title('各年级各学科平均成绩条形图')
plt.xlabel('科目')
plt.ylabel('平均成绩')

plt.xticks([p + bar_width * (len(classes) - 1) / 2 for p in index], subjects)

plt.legend(title='班级', bbox_to_anchor=(1.05, 1), loc='upper left')

plt.tight_layout()
plt.show()


#折线图
plt.figure(figsize=(10, 6))
for i, class_name in enumerate(classes):
    plt.plot(subjects, scores[class_name], marker='o', label=class_name)
plt.title('折线图')
plt.xlabel('科目')
plt.ylabel('平均成绩')
plt.legend()
plt.show()

雷达图代码:

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置显示中文字体
plt.rcParams['axes.unicode_minus'] = False # 设置正常显示符号
courses = np.array(['语文', '数学', '英语', '物理','化学', '生物'])
scores = np.array([[95, 75, 86],
 [96, 93, 76],
 [85, 66, 96],
 [63, 85, 93],
 [91, 88, 67],
 [86, 76, 87]])
# 数据的长度
data_length = len(scores)
# 把圆周等分为data_length份
angles = np.linspace(0, 2*np.pi, data_length, endpoint=False)
scores = np.concatenate((scores, [scores[0]]))
angles = np.concatenate((angles, [angles[0]]))
courses=np.concatenate((courses,[courses[0]]))
# 绘制雷达图
plt.polar(angles, scores, 'o-', linewidth=3)
# 设置角度和网格标签
plt.thetagrids(angles*180/np.pi, courses,
fontproperties='simhei')
plt.title('成绩评估')
plt.legend(['高二1班', '高二2班', '高二3班'], loc=(0.94, 0.80),
 labelspacing=0.1)
plt.show()

运行结果实例:

步阶图:

条形图:

折线图:

雷达图:

代码分析:

  • plt.rcParams['font.sans-serif'] = 'SimHei' 设置matplotlib图表中使用的默认字体为“SimHei”,以便支持中文显示。
  • plt.rcParams['axes.unicode_minus'] = False 设置matplotlib图表中不使用Unicode字符来表示负号。
  1. 步阶图(条形图)

    • 首先定义了班级、学科、每个班级的学科分数以及平均分数。
    • 创建一个条形图,每个班级的分数在x轴上以学科为单位,y轴是分数。使用plt.bar函数,每个班级的条形按照班级顺序排列,宽度为bar_width,并设置了中文标签和图例。
  2. 条形图(另一种展示方式)

    这部分代码与步阶图类似,但是使用了subplots函数创建一个新的子图,每个班级的条形图在不同的位置,更清晰地展示了每个班级的数据。
  3. 折线图

    最后,创建一个折线图,每个班级的学科分数作为y轴,x轴是学科名称。通过plt.plot函数绘制,每个班级用不同的标记('o')表示,并设置了图例
  4. 雷达图:

    (1)定义数据:courses是一个包含科目名称的numpy数组。
    scores是一个二维numpy数组,其中每行代表一个班级在不同科目上的成绩。(2)计算数据长度和角度:data_length变量存储scores数组中班级的数量。
    angles变量使用np.linspace函数生成一个等差数列,表示雷达图的每个角度,这些角度对应于科目。(3)闭合雷达图:为了绘制一个闭合的雷达图,代码将scores、angles和courses数组连接起来,将第一个元素添加到数组的末尾。(4)绘制雷达图:使用plt.polar函数绘制雷达图,其中angles是角度,scores是成绩,'o-'指定了线型(带有圆圈标记的实线),linewidth=3设置了线宽。(5)设置角度和网格标签:plt.thetagrids函数用于设置雷达图的角度刻度标签,angles*180/np.pi将角度从弧度转换为度,courses是每个角度对应的科目名称。(6)设置标题和图例:plt.title设置图表的标题为“成绩评估”。
    plt.legend添加图例,指定了图例的位置和标签。(6)显示图表:plt.show()函数显示最终的雷达图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值