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字符来表示负号。
-
步阶图(条形图):
- 首先定义了班级、学科、每个班级的学科分数以及平均分数。
- 创建一个条形图,每个班级的分数在x轴上以学科为单位,y轴是分数。使用
plt.bar
函数,每个班级的条形按照班级顺序排列,宽度为bar_width
,并设置了中文标签和图例。
-
条形图(另一种展示方式):
这部分代码与步阶图类似,但是使用了subplots
函数创建一个新的子图,每个班级的条形图在不同的位置,更清晰地展示了每个班级的数据。 -
折线图:
最后,创建一个折线图,每个班级的学科分数作为y轴,x轴是学科名称。通过plt.plot
函数绘制,每个班级用不同的标记('o')表示,并设置了图例 - 雷达图:
(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()函数显示最终的雷达图