【Python信息可视化实战篇】基于matplotlib分析51job数据信息并制作柱状图

        前几天博主有个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()

猜你喜欢

转载自blog.csdn.net/qq_42506411/article/details/106996770