普通高中选课数据分析和可视化(2)

Python算法之旅

共 3494字,需浏览 7分钟

 · 2021-05-27

前情回顾:

上一篇文章我们介绍了“普通高中选课数据分析和可视化”项目的“项目目标”,“项目准备阶段”和“项目实施过程”的第1部分“3.1  7选3单科数据处理”,接下来我们继续项目实践之旅。


“普通高中选课数据分析和可视化”项目分析报告(第2部分)

3.2  绘制各校各科人数柱状图
我们引用了第三方库matplotlibcsv文件中读取某市16所普通高中选课汇总数据。MatplotlibPython2D绘图库,它可与numpy一起使用,仅需要几行代码,便可以生成直方图、条形图,饼图、散点图等高质量图形,提供了一种有效的MatLab开源替代方案。
我们使用语句import matplotlib.pyplot as plt引入库,然后打开"xk73.csv"文件,读取某市普通高中选课汇总数据,存储到DataFrame对象df中;然后按学校分组计数,调用DataFrame.plot方法绘制各校各科人数堆积柱状图,还可以分成多个子图,分别绘制各校各科人数柱状图(如下图所示)。

3 各校各科选考人数堆积柱状图

4 各校各科选考人数柱状图(多子图)
核心代码(完整代码详见源代码文件“73绘制各校各科人数柱状图.py”):
#调用DataFrame.plot方法绘制各校各科人数柱状图(去除总人数)#将索引更名为学校代码,以便更好显示横坐标sc = sc.rename(index={i:school[i] for i in sc.index})sc[kms[1:]].plot(kind='bar',rot=0, stacked=True)
#调用DataFrame.plot方法分别绘制各校各科人数柱状图(包含总人数)colors = ('purple', 'red','green','orange','cyan','lime','gold','blue')col = m // 3 #最大列数n = (len(school)+col-1) // col #最大行数#划分子图,分成n*col个区域,并设置各个子图的宽、高和绘图分辨率fig, axes = plt.subplots(n, col,figsize=(8, 12), dpi=80)for i, k in enumerate(school, start=0): #遍历每一所学校,绘制各校选课人数饼图 plt.subplots_adjust(hspace = 0.4) #为子图之间的空间保留的高度 for j, km in enumerate(kms, start=0): axes[i//col,i%col].bar(km, sc.loc[k][km], color=colors[j]) axes[i//col,i%col].set_title("学校"+k+"各科人数") #为每个子图设置标题
plt.show()

3.3  绘制各校各科人数雷达图
   和绘制柱状图一样,我们需要先对DataFrame对象df按学校分组计数,再去绘制各校各科人数雷达图。我们既可以在同一个区域绘制各校各科选考人数雷达图,也可以分成多个子图,分别绘制各校各科选考人数雷达图(如下图所示)。

5 各校各科选考人数雷达图

6 各校各科选考人数雷达图(多子图)
核心代码(完整代码详见源代码文件“73绘制各校各科人数雷达图.py”):
#根据子图的行列数、编号、标题、颜色、变量列表、角度列表、数据列表、图例标签和极径范围绘制雷达图def draw_polar(rows, cols, num, title, color, categories, angles, values, label, rlim):    # 初始化极坐标网格    ax = plt.subplot(rows, cols, num, projection='polar')    ax.set_rlabel_position(0) #于设置极径标签显示位置    ax.set_rlim(0, rlim) #设置显示的极径范围    # If you want the first axis to be on top:    ax.set_theta_offset(pi / 2)# 设置角度偏移    ax.set_theta_direction(-1)# 设置顺时针还是逆时针,1或者-1    # 设置标签    plt.xticks(angles[:-1], categories)    plt.yticks([i for i in range(100, rlim, 100)], [str(i) for i in range(100, rlim, 100)], color="grey", size=7)    # 绘制雷达图    ax.plot(angles, values, linewidth=1, linestyle='solid', label=label)    ax.fill(angles, values, color, alpha=0.1)    plt.title(title, size=11, color=color, y=1.2)


3.4  绘制各校各科人数占比饼图
和绘制柱状图一样,我们需要先对DataFrame对象df按学校分组计数,再去绘制各校总人数占比饼图,或者分成多个子图,分别绘制各校各科人数占比饼图(如下图所示)。

7 各校选考总人数占比饼图

8 各校各科选考人数占比饼图(多子图)
核心代码(完整代码详见源代码文件“73绘制各校各科人数饼图.py”):
#绘制各校总人数占比饼图labels = [str(i)[-2:] for i in sc['学校代码']]sizes = sc['人数'].valuesexplode = [0] * len(sizes)plt.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=False,startangle=150)plt.title("各校总人数占比饼图")plt.axis('equal')   #该行代码使饼图长宽相等
#分别绘制各校各科人数占比饼图col = m // 3 #最大列数n = (len(school)+col-1) // col #最大行数#划分子图,分成n*col个区域,并设置各个子图的宽、高和绘图分辨率fig, axes = plt.subplots(n, col,figsize=(8, 8), dpi=100)for i, k in enumerate(school, start=0): #遍历每一所学校,绘制各校选课人数饼图 labels = kms #(每一块)饼图外侧显示的说明文字 sizes = sc.iloc[i].values[2:] #(每一块)的比例,如果sum(x) > 1会使用sum(x)归一化 explode = [0] * len(sizes) #(每一块)离开中心距离 axes[i//col,i%col].pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=False,startangle=150) axes[i//col,i%col].set_title("学校"+k+"各科人数占比饼图") #为每个子图设置标题
plt.show()

说明:因为本项目内容较多,故写成系列文章分成多次分享,请大家稍安勿躁哦。

需要本文word版或者相关源代码的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。


我们专注Python算法,感兴趣就一起来!



相关优秀文章:

阅读代码和写更好的代码

最有效的学习方式

斌哥教你自制多功能单词本

普通高中选课数据分析和可视化(1)


浏览 49
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报