前几天博主有个Python信息数据可视化的需求,但是博主学python是用来玩网络爬虫的。对于python信息数据可视化类库,也只是熟悉pyecharts。因此,便只能现学现卖直播作mai图yi。在参考着资料学习后,成功的用matplotlib完成了第一幅柱状图。
1.python类库:matplotlib库(作图)
2.python类库:xlrd库(导入读取excel文件)
3.数据信息源文件:51plt.xlsx
1.首先观察数据信息excel源文件,明确信息目标。因为我们的目标是制作“职位数按城市分布情况”的柱状图,所以需要提取的列项是“city”。
2.要想实现制作“职位数按城市分布情况”的柱状图的小目标,我们首先需要知道各个城市的职位数。这个表格是整合后的数据表格,里面共计10+1个城市项,因此可以通过统计city这一列的数量来完成。
按照我的想法,可以通过键值对的形式存储数据(城市名称:城市数量)到列表中,再分别一一对应提取到一个新的列表用于制图。
3.制图问题。这个没什么好说的,主要就是通过matplotlib.pyplot类库进行制图。但是因为导入的excel表格信息数据中具有中文字段,因此需要添加以下两行代码解决中文乱码和负号问题。
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码问题,用于正常显示中文标签(用黑体显示中文)
plt.rcParams['axes.unicode_minus'] = False # 用于正常显示负号为方块
1.导入excel表格文件。根据我手边资料查阅的结果来看,导入excel表格文件的方法很多,但是又很混乱。而且因为版本的迭代问题,有些类库的方法已经无法使用。最后我使用xlrd库,能够正常导入excel表格数据。具体代码模块如下:
import xlrd
xlsxfile = r"51plot.xlsx"
infors = xlrd.open_workbook(xlsxfile) # 打开excel文件,创建一个workbook对象
infors.sheets() # sheets方法返回对象列表
rsheet = infors.sheet_by_index(0) # 取第一个工作簿
2.在打开excel文件后,使用row[].value方法便能够提取其中的列项了。row[]数组里面的索引从0开始,观察excel表格,可发现city的索引序号是5。因此我们提取除了第一行“city”外的全部城市项放入列表中。
citys = [] # 创建一个空列表citys[]
for row in rsheet.get_rows():
city_column = row[5] # 城市所在的列
city_infor = city_column.value # 项目名
if city_infor != 'city': # 去掉city标题
citys.append(city_infor)
# print(citys) # 输出全部城市数据
3.之后,需要统计各个城市项的数量。因此,我们需要用到set()集合和count()方法进行统计(set集合中不允许出现重复元素),并将结果整合成键值对的形式。最后再通过.keys()方法和.value()方法分别提取出来键和值。(需要用list()方法转换成列表的形式,否则输出的结果是dict_keys([]))
# print(set(citys)) # set集合中不允许出现重复元素
for i in set(citys): # 遍历citys列表,统计所有元素出现次数
citys_result[i] = citys.count(i)
print(citys_result) # 输出各城市的字典键值对
print(list(citys_result.keys())) # 输出的是dict_keys([]),需要通过list()方法转换成列表形式
print(list(citys_result.values())) # 输出的是dict_values([]),需要通过list()方法转换成列表形式
4.使用matplotlib类库进行制图,要注意必须解决中文乱码问题。其中,我特别标注了柱状图的最大值和最小值,并将柱状图按照倒序的顺序进行排序。color的颜色选项添加11种不同的颜色,则能够使得11个数据项柱状图分别以不同的颜色进行显示。
plt.figure(figsize=(8, 6), dpi=80) # 建立型号为(8,6),分辨率为80的画布
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码问题,用于正常显示中文标签(用黑体显示中文)
plt.rcParams['axes.unicode_minus'] = False # 用于正常显示负号为方块
plt.title("职位数按城市分布情况")
plt.ylim((0, 2000)) # 标注最大值坐标
plt.bar(sorted(list(citys_result.keys()), reverse=True), # 对列表数据排序(倒序)
sorted(list(citys_result.values()), reverse=True), color=['#0066CC', '#FF8000', '#009100', '#CE0000',
'#B15BFF', '#743A3A', '#FF77FF', '#7B7B7B',
'#C4C400', '#00CACA', '#000093'])
plt.show()
import xlrd
import matplotlib.pyplot as plt
# import ast
xlsxfile = r"51plot.xlsx"
citys = [] # 创建一个空列表citys[]
citys_result = {} # 创建一个空字典citys_result{}
infors = xlrd.open_workbook(xlsxfile) # 打开excel文件,创建一个workbook对象
infors.sheets() # sheets方法返回对象列表
rsheet = infors.sheet_by_index(0) # 取第一个工作簿
for row in rsheet.get_rows():
city_column = row[5] # 城市所在的列
city_infor = city_column.value # 项目名
if city_infor != 'city': # 去掉city标题
citys.append(city_infor)
# print(citys) # 输出全部城市数据
# print(set(citys)) # set集合中不允许出现重复元素
for i in set(citys): # 遍历citys列表,统计所有元素出现次数
citys_result[i] = citys.count(i)
print(citys_result) # 输出各城市的字典键值对
print(list(citys_result.keys())) # 输出的是dict_keys([]),需要通过list()方法转换成列表形式
print(list(citys_result.values())) # 输出的是dict_values([]),需要通过list()方法转换成列表形式
# x = "[" + str(list(result.values())[0]) + "]"
# print(list(result.keys())[0], x, ast.literal_eval(x)) # ast的literal_eval()方法:用于将字符串类型转换成列表类型
plt.figure(figsize=(8, 6), dpi=80) # 建立型号为(8,6),分辨率为80的画布
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码问题,用于正常显示中文标签(用黑体显示中文)
plt.rcParams['axes.unicode_minus'] = False # 用于正常显示负号为方块
plt.title("职位数按城市分布情况")
plt.ylim((0, 2000)) # 标注最大值坐标
plt.bar(sorted(list(citys_result.keys()), reverse=True), # 对列表数据排序(倒序)
sorted(list(citys_result.values()), reverse=True), color=['#0066CC', '#FF8000', '#009100', '#CE0000',
'#B15BFF', '#743A3A', '#FF77FF', '#7B7B7B',
'#C4C400', '#00CACA', '#000093'])
plt.show()