手动绘制较为好看的平均绩点走势图

手动绘制较为好看的平均绩点走势图

(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()

在这里插入图片描述

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值