要用到Numpy库和Matplotlib库,以一个简单的例题为例,统计各班的6科成绩并用雷达图表示。 import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = 'SimHei' plt.rcParams['axes.unicode_minus'] = False courses = np.array(['语文', '数学', '英语', '物理', '化学', '生物']) class_scores = [ np.array([95, 75, 86, 96, 93, 76]), np.array([85, 66, 96, 63, 85, 93]), np.array([91, 88, 67, 86, 76, 87]) ] for idx, scores in enumerate(class_scores, start=1): angles = np.linspace(0, 2 * np.pi, len(courses), endpoint=False) scores_padded = np.concatenate((scores, [scores[0]])) angles_padded = np.concatenate((angles, [angles[0]])) plt.polar(angles_padded, scores_padded, "o-", linewidth=3, label=f"高二{idx}班") plt.thetagrids(angles * 180 / np.pi, courses, fontproperties="SimHei") plt.title("成绩评估") plt.legend(loc=(0.94, 0.80), labelspacing=0.1) plt.show()c 程序分析:
-
导入库:
- 导入
numpy
库并简写为np
,用于数组操作和数学计算。 - 导入
matplotlib.pyplot
库并简写为plt
,用于数据可视化,特别是绘制图表。
- 导入
-
设置字体:
- 为了使中文能够正常显示在图表中,设置了matplotlib的字体配置,指定中文字体为'SimHei'(黑体),并关闭了负号的Unicode编码问题,确保减号能正确显示。
-
定义科目数组:
courses
数组存储了六个科目的名称,分别是:语文、数学、英语、物理、化学、生物。
-
定义班级成绩数据:
class_scores
是一个二维列表(实际上是NumPy数组的列表),包含了三个班级在六门课程上的成绩数据。
-
绘制雷达图循环:
- 使用
enumerate
函数遍历每个班级的成绩数据,同时通过start=1
参数使索引从1开始计数,对应高二1班、高二2班、高二3班。 - 对于每个班级,执行以下步骤:
- 计算每个扇区的角度,使用
linspace
函数从0到2π(不包括2π),确保角度均匀分布且与科目数量相匹配。 - 为了闭合图形,将成绩列表首位相连(即在成绩列表末尾添加第一个成绩,在角度列表末尾添加第一个角度)。
- 调用
plt.polar
函数绘制雷达图,其中angles_padded
和scores_padded
分别为角度和成绩,"o-"指定了线型和标记点样式,linewidth=3
设置了线条宽度,label
参数为图例标签,如"高二1班"。
- 计算每个扇区的角度,使用
- 使用
-
图表其他配置:
- 使用
thetagrids
函数设置雷达图的轴标签,使其对应科目名称,并转换角度为度数显示,同时设置字体以便中文显示。 - 设置图表标题为"成绩评估"。
- 通过
legend
函数放置图例,调整其位置为(0.94, 0.80)
,并设置了labelspacing=0.1
以微调图例的间距。
- 使用
-
展示图表:最后,调用
plt.show()
显示绘制好的雷达图。