提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
`
在工作中,领导让我做一个批量生成分组条形图的项目。
每一个条形图都代表了某一个学科领域各个等级的人才在不同年龄段的分布情况。
一、引出数据
数据是以csv文件的形式发给我的,所以首先要将csv文件有条理的放进python之中,我先建立一个字典,用来保存数据,建立一个字符串用来保存学科名。
所给数据如图:
#引入库
from pathlib import Path
import csv
#r为文件存储路径
path = Path(r)
lines = path.read_text().splitlines()
reader = csv.reader(lines)
header = next(reader)
talents = {
'below 30': [],
'31-40': [],
'41-50': [],
'51-60': [],
'61-70': [],
'over 70': [],
}
project_name = ""
for index in reader:
project_name = index[8]
talents['below 30'].append(int(index[2])/10000)
talents['31-40'].append(int(index[3])/10000)
talents['41-50'].append(int(index[4])/10000)
talents['51-60'].append(int(index[5])/10000)
talents['61-70'].append(int(index[6])/10000)
talents['over 70'].append(int(index[7])/10000)
二、作图
1.引入宋体字体
由于图中有使用特定字体的要求,所以先引入特定的字体
from matplotlib.font_manager import FontProperties
font2 = FontProperties(fname='C:/Windows/Fonts/simsun.ttc', size=12) # 注意:路径可能因系统而异
font1 = FontProperties(fname='C:/Windows/Fonts/simsun.ttc', size=24)
#font1和font2都是宋体,只是大小不同,simun.tt 是基于宋体字体的中文简体字体
2.大锤搞定——绘图
柱状图的横轴上为三类人才,每类人才作为一个条形图分组,并且由于三类人才的数量差距较大,在这里纵坐标使用它们的对数形式。
species = ("顶尖人才", "领头人才", "其他人才")
x = np.arange(len(species)) # 每个人才标签所在的位置
width = 0.1 # 条形图的宽度
multiplier = 0 # 用来指示当前分组中下一个数据条需要偏移该分组起点的距离是一个数据条宽度的多少倍
fig, ax = plt.subplots(figsize=(10,6),)
# 设置对数刻度
plt.yscale('log')
#建立颜色映射
colormap = ('#ADD8E6', '#87CEFA', '#87CEEB', '#00BFFF', '#1E90FF', '#4169E1')
#指示器,用来指示颜色坐标
iter = 0
for age, num in talents.items():
offset = width * multiplier #偏移量
#每一次循环,都做出一个年龄段在三个分组中的不同图形,有6个年龄段,需要循环6次
rects = ax.bar(x+offset, num, width=width, label=age, color=colormap[iter])
iter += 1 #做完一个年龄段后,颜色指示器加一,旨在下次个年龄段使用不同颜色
labels = [int(i*1_0000) for i in num]
#在条形图的每个柱子上加标签,由于为了图形比例尽可能易于观察,在引入数据时除去了10_000,在标记时乘回来
ax.bar_label(rects,labels=labels, padding=3)
#下一柱子相比前一柱子距离分组起点位置更靠后
multiplier += 1.05
3. 小锤抠缝——修饰图
#y轴title
ax.set_ylabel('log(总人数)', fontsize=14, font=font2)
#图形title
ax.set_title(f'{project_name}\n各层次人才年龄段分布情况',font=font1)
#x轴标签
ax.set_xticks(x + width, species,font=font2)
#颜色指示器
ax.legend(loc='upper left', ncols=3)
#y轴刻度范围
ax.set_ylim(0, 5)
ax.tick_params(labelsize=10)
#去除边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
#保存图片
plt.savefig(f'{project_name}各层次人才年龄段分布情况.png')
plt.show()
总结
下一工位