普通高中选课数据分析和可视化(2)
Python算法之旅
共 3494字,需浏览 7分钟
·
2021-05-27 19:09
前情回顾:
#调用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()
#根据子图的行列数、编号、标题、颜色、变量列表、角度列表、数据列表、图例标签和极径范围绘制雷达图
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)
#绘制各校总人数占比饼图
labels = [str(i)[-2:] for i in sc['学校代码']]
sizes = sc['人数'].values
explode = [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)
评论