在大概了解了Python读写各种文件的方法和数据可视化库matplotlib中一些API的使用后,花了一点时间写了这个带有实践意义的简单程序——成绩雷达图。
在刚开始时我曾尝试直接用输入各学科名称和成绩来存列表,发现运行过程中每次都要敲回车实在是很麻烦,也不利于大规模成绩查询和雷达图绘制,于是我想起来前面学了一些Python处理Excel文件的方法并用于实践。
代码如下:
#成绩雷达图绘制
import matplotlib.pyplot as plt
import numpy as np
import openpyxl as ox
#中文显示
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#初始创建学科名称name_courses和对应分数scores两个空列表用于后续储存
name_courses=[]
scores=[]
sheetname=input('请输入学生编号及姓名:')
print('读入各学科及对应成绩中')
#读入Excel文件中的学科名称及对应成绩
wb = ox.load_workbook('CoursesAndScores.xlsx')
sheet = wb.get_sheet_by_name(sheetname)
n_courses=sheet.max_row-1
print('共计'+str(n_courses)+'门课程\n')
for i in range(2,sheet.max_row+1):
name_courses.append(sheet['A'+str(i)].value)
scores.append(sheet['B'+str(i)].value)
print('成绩读入完成,绘制雷达图中')
#根据学科数目确定角度偏转次数,为曲线重合在列表尾部再加入第一个元素
theta=np.linspace(0,2*np.pi,n_courses,endpoint=False)
theta=np.append(theta,theta[0])
scores.append(scores[0])
#将学科名称和分数合成,一起标注在对应的角度
nameNscores=[]
for i in range(n_courses):
nameNscores.append(name_courses[i]+' '+str(scores[i]))
#绘制雷达图
plt.polar(theta,scores,'c--',lw=1)
plt.thetagrids(theta*180/np.pi,nameNscores,fontproperties='simhei')
plt.fill(theta,scores,facecolor='c',alpha=0.2)
plt.title(sheetname+'的成绩雷达图',verticalalignment='baseline',fontsize=12)
plt.show()
print('绘制完成')
看着其实是非常简单的逻辑加接口实现了一个以前感觉很厉害的东西,有点学习到东西的意味了。
这里强调两点:
#将学科名称和分数合成,一起标注在对应的角度
nameNscores=[]
for i in range(n_courses):
nameNscores.append(name_courses[i]+' '+str(scores[i]))
为了同时把学科名称和成绩显示清楚,我尝试过在thetagrids下功夫查了很久试了不少都只能标注一个列表,所以想到把这俩加起来,如果有其他解决办法,希望不吝赐教。
还有是下面这段代码一定要搞清楚
#中文显示
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
这段代码能改变编码把中文以黑体输出在图上,如果没有会出现乱码。
下面是程序结果:
以上就是画出001号天下第一帅气的成绩雷达图!
对于便捷的整体输入在执行框里进行互动,我还没有好的方法;并且这个程序在我用Pyinstaller 打包成可执行exe文件时无法执行,我猜和他需要读取Excel文件有关,仍不清楚。
希望对上面及文章中间一共提出三个我的问题有想法的朋友,在评论区不吝赐教!