手动绘制较为好看的平均绩点走势图
(1)教务处导出的成绩注释处的数据为学期数、每学期绩点(注意不是平均绩点也不是该学期与之前所有学期的绩点总和)和每学期学分数(注意不是该学期与之前所有学期的学分数总和);
(2)这里编写第二学位是考虑到有同学修读双学位(或辅修学士学位)但第二学位没有完全覆盖第一学位的情况,无第二学位者可将 minor 的部分删除;
(3)该代码只支持在 Windows 操作系统上启动,如果需要切换到其它操作系统,请正确修改代码的前五行;
(4)标记具体数值是手动的方法,可能需要根据实际情况微调,最大化窗口后这些数值标记将会混乱;
(5)请在运行后验证计算所得的平均绩点是否正确。
import os
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
os.chdir(os.path.abspath(os.path.dirname(__file__)))#解析进入程序所在目录
font = FontProperties(fname = "C:\\Windows\\fonts\\simsun.ttc")
# 教务处导出的成绩
majorX = list(range(1, 9)) # 第一学位
majorPts = [83.50, 99.45, 87.20, 103.50, 100.5, 106.30, 72.20, 63.40] # 每学期绩点
majorCred = [23, 24, 24, 26, 24, 24, 16, 14] # 每学期学分
minorX = list(range(3, 7)) # 第二学位
minorPts = [32.40, 55.50, 56.70, 40.40] # 每学期绩点
minorCred = [15, 18, 15, 12] # 每学期学分
# 初始化平均绩点走势列表
majorTerm = []
majorTotal = []
minorTerm = []
minorTotal = []
# 计算平均绩点
for i in range(len(majorX)): # 放置第一学位每个学期的学期平均绩点和总平均绩点
majorTerm.append(round(majorPts[i] / majorCred[i], 2))
majorTotal.append(round(sum(majorPts[:i + 1]) / sum(majorCred[:i + 1]), 2))
for i in range(len(minorX)): # 放置第二学位每个学期的学期平均绩点和总平均绩点
minorTerm.append(round(minorPts[i] / minorCred[i], 2))
minorTotal.append(round(sum(minorPts[:i + 1]) / sum(minorCred[:i + 1]), 2))
# 打印平均绩点
print("第一学位学期平均绩点:{0}".format(majorTerm))
print("第一学位总平均绩点:{0}".format(majorTotal))
print("第二学位学期平均绩点:{0}".format(minorTerm))
print("第二学位总平均绩点:{0}".format(minorTotal))
# 绘图
plt.plot(majorX, majorTerm, marker = "o", color = "red")
plt.plot(majorX, majorTotal, marker = "x", color = "orange")
plt.plot(minorX, minorTerm, marker = "v", color = "green")
plt.plot(minorX, minorTotal, marker = "^", color = "blue")
# 标记具体数值
for a, b in zip(majorX, majorTerm):
plt.annotate("{0:.2f}".format(b), xy = (a, b), xytext = (a - 0.2, b + 0.03))
for a, b in zip(majorX, majorTotal):
plt.annotate("{0:.2f}".format(b), xy = (a, b), xytext = (a - 0.2, b + 0.03))
for a, b in zip(minorX, minorTerm):
plt.annotate("{0:.2f}".format(b), xy = (a, b), xytext = (a - 0.2, b - 0.12))
for a, b in zip(minorX, minorTotal):
plt.annotate("{0:.2f}".format(b), xy = (a, b), xytext = (a - 0.2, b - 0.12))
plt.ylim(min(majorTerm + majorTotal + minorTerm + minorTotal) - 0.2, max(majorTerm + majorTotal + minorTerm + minorTotal) + 0.2)
# 标记标题、坐标轴和 legend
plt.title("平均绩点走势图", fontproperties = font)
plt.xlabel("学期", fontproperties = font)
plt.ylabel("平均绩点", fontproperties = font)
plt.legend(["第一学位学期平均绩点", "第一学位总平均绩点", "第二学位学期平均绩点", "第二学位总平均绩点"], prop = font)
# 显示或保存
plt.rcParams["figure.dpi"] = 1200
plt.rcParams["savefig.dpi"] = 1200
plt.savefig("GPA.png") # plt.show()
plt.close()