- 写在前面:我是一名大二在读的学生,专业是财务管理,与代码没有一点关系的,oh。但非常喜欢编程,目前正在努力学习,希望大家多多支持,嘿嘿
- 问题描述:有一张excel表,如下图:
我们的任务是根据这张表,统计不同学院开设的不同课程的门数,并将其图表可视化。这个任务的难点是对于同一门课程,同一个学院会因为设置不同的老师教授以及不同的上课时间,因此需要去重操作。 - 解决方案:对于大佬来说,这个任务用numpy和pandas应该能很快并且很简洁地完成。对于萌新以及我自身来说,我考虑的是利用openxyl库提取数据,pylot库和pygal库作图。具体的代码方案如下,注释相当清楚,便于萌新学习。这里使用了之前学习到的字典的setdefault方法,去重采用了集合的特性:
import openpyxl
import matplotlib.pyplot as plt
import pygal
wb = openpyxl.load_workbook('kebiao1.xlsx')
sheet = wb['kebiao']
# 得出每个学院开设的课程,未去重
d = {}
for i in range(1, sheet.max_row+1):
d[sheet.cell(row=i, column=7).value] = d.get(
sheet.cell(row=i, column=7).value, 0)+1
# print(d)
# 进一步统计每个学院不同的课程总数
l = []
# 得到开课学院,未去重
for i in range(2, sheet.max_row+1):
l.append(sheet.cell(row=i, column=7).value)
# print(l)
# 利用集合特性去重相同的学院
list_xueyuan = list(set(l))
# print(list_xueyuan)
dict_chushi = {}
for i in list_xueyuan:
for j in range(2, sheet.max_row+1):
if sheet.cell(row=j, column=7).value == i:
dict_chushi.setdefault(i, []).append(
sheet.cell(row=j, column=5).value)
# 课程去重处理
dict_quchong = {}
for i in dict_chushi.items():
list_quchong = list(set(i[1]))
for j in list_quchong:
dict_quchong.setdefault(i[0], []).append(j)
# print(dict_quchong)
dict_tuxiang = {}
for i in dict_quchong.items():
dict_tuxiang[i[0]] = len(i[1])
# 创建图表的方法一
hist = pygal.Bar() # 创建一个条形图的实例
hist.title = '表' # 图标标题
hist.x_labels = dict_tuxiang.keys() # 自变量的取值
hist.x_title = '课程'
hist.y_title = '计数'
hist.add('不明所以', dict_tuxiang.values()) # 因变量的取值
# hist.render_to_file('图.svg') 以svg格式储存图表
# 创建图表的方法二
plt.plot(dict_tuxiang.keys(), dict_tuxiang.values(),
linewidth=5) # linewidth决定了plot()绘制线条的粗细
plt.title('未知', fontsize=24) # 图表命名
plt.xlabel('学院', fontsize=6) # 横坐标命名
plt.ylabel('数量', fontsize=14) # 纵坐标命名
plt.tick_params(axis='both', labelsize=6) # 设置刻度标记的大小
plt.show()
处理达到的结果如图:
这是使用pygal做出的简单条形图。另一个的pylot做出的图此处不再展示。
- 写在最后:请多多点赞评论呀,萌新一起进步,o( ̄▽ ̄)ブ。另外,这个excel表格各高校的官网应该都有,是全校的课表,可以去自己所在的学校官网下载。或者在评论区留下邮箱,我发你们。