
目录
[1. 什么是工作薄和工作表?](#1. 什么是工作薄和工作表?)
[2. 什么是单元格?](#2. 什么是单元格?)
[3. 使用openpyxl读取xlsx文件](#3. 使用openpyxl读取xlsx文件)
[1. 漏斗图的概念](#1. 漏斗图的概念)
[2. 漏斗图的指标和计算方法](#2. 漏斗图的指标和计算方法)
[3. 从Excel中读数据绘制单个漏斗图。](#3. 从Excel中读数据绘制单个漏斗图。)
前言
浩宇是一家公司的HR,一般使用漏斗图来展示各个环节的进入的人数,在进行绘制之前需要得到各个环节的转化率。公司有多个部门以及多个岗位,利用excel处理又慢又累,如果部门的部分数据更改就需要重新绘制,面对繁琐的画图流程,浩宇想要实现自动化绘制。
一、批量获取数据
浩宇要查看岗位在不同环节的通过率,并批量读取数据绘制漏斗图。
首先,我们先学习批量读取数据的方法,绘制用于展示总体招聘情况的图表
如何选择合适的图表呢?不妨简单分析一下,每个岗位都有初筛、一面、二面等多个环节,要查看简历数量随着招聘环节的变化。折线图和柱状图都能反映数量的变化,考虑到岗位数量很多,折线图绘制出来以后会比较混乱,这里我们采用柱状图。
本节的学习目标:
了解Excel文档的工作簿和工作表;
学习读取工作簿、工作表和行读取的操作;
定义函数,绘制多y轴柱状图。
1. 什么是工作薄和工作表?
一个Excel文档就叫做工作簿(Workbook),图中是Excel文档,该文档的后缀名为.xlsx,所以工作簿的名称为候选人跟进.xlsx。
一个工作簿中包含一个或多个工作表(Worksheet)。

2. 什么是单元格?
一个工作表由单元格(Cell)组成。Excel的数据存储在单元格中。
我们可以通过列号(Column)和行号(Row)对单元格进行定位。

3. 使用openpyxl读取xlsx文件
要使用Python对Excel表格进行读取,我们需要安装一个用于读取数据的工具 openpyxl 。
在终端输入以下指令,利用pip安装openpyxl模块
python
pip install openpyxl
接着导入openpyxl模块开始读取数据,读取路径下的Excel文档,需要用到openpyxl.load_workbook()函数,将文件路径传入函数中,就读取了这个文档的数据。
python
import openpyxl
path = "E:\pyTest\数据可视化学习\7-1\caicai\岗位信息表.xlsx"
wb = openpyxl.load_workbook(path)
position = wb["岗位序列"]
浩宇需要绘制柱状图,柱状图的格式要求横纵坐标以列表的形式存储数据。
这里我们先读取第一行的标题作为横坐标;读取第二行的数据作为纵坐标

python
title = position[1]
print(title)
得到以下结果

可以看到他输出的只是第一行的单元格名称,不能看到具体的标题,我们使用value属性来找到真实的数据。
python
title = position[1]
for i in title:
print(i.value)
我们又又又发现问题了,第一个单元格表格是空的,我们需要去掉他
python
x_list = []
for i in title:
x_list.append(i.value)
print(x_list[1:])
到这里,相信大家对openpyxl库处理excel文件有一定了解了,大家试着把第二行的数据处理一下。
-
读取第二行数据;
-
定义一个列表用于存储该行的内容;
-
使用切片从第二个元素开始遍历;
-
使用 .value 取单元格的值;
-
使用 append() 将内容追加到列表中,这里就不再重复了。
可是数据有多行,我们不需要写很多重复的代码,我们可以利用函数封装起来,将每个岗位的行数当成参数,调用该函数就可以完成多y轴柱状图的绘制。
python
def read_ex(row):
y_list = []
total = position[row]
for i in total[1:]:
y_list.append(i.value)
return (total[0].value,y_list)
完成函数的定义后,我们需要读取文档中第1行到第7行的数据,这里我们可以使用 for循环和 range() 函数来循环获取1~7的数字,以达到逐个获取行数据的目的。

python
for i in range(1,8):
print(read_ex(i))

元组的第一个元素是空值/岗位名称,元组的第二个元素是x轴/y轴的数据,我们将返回的第一个元素赋值给name,第二个元素赋值给num。
python
for i in range(1,8):
data = read_ex(i)
name = data[0]
num = data[1]
print(name,num)
这样我们的数据就处理好了,我们开始绘制柱状图
二、绘制柱状图
python
import pyecharts.charts import Bar
bar = Bar()
#读取数据后画表格
for i in range(1,8):
data = read_ex(i)
name = data[0]
num = data[1]
if i == 1:
bar.add_xaxis(num)
else:
bar.add_yaxis(series_name = name, y_axis = num)
bar.render(r"E:\pyTest\数据可视化学习\可视化图表\岗位序列.html")
得到以下结果:

这样我们就画好了柱状图。
小结
处理数据我们用到的是openpyxl模块,首先利用load_workbook函数读取工作簿,紧接着读取了工作表,再根据工作表里的内容处理了数据并封装成了函数,最后将转化后的数据绘制成了柱状图
三、绘制漏斗图
1. 漏斗图的概念
漏斗图(Funnel Chart)图形样式与漏斗类似,能够直观展示各环节业务数据的变化情况。
每个阶段的数据自上而下减少,有助于快速发现和定位问题所处环节。
比较常用在电商网站分析中,通过展示各环节转化,了解用户看到商品至下单的每个步骤的转化情况。
漏斗图举例
如何绘制呢?
使用 pyecharts 绘制漏斗图,需要导入Funnel 模块。
python
from pyecharts.charts import Funnel
绘制柱状图或折线图时,需要传入x轴和y轴数据,和绘制漏斗图传入的数据类型有些区别。
漏斗图不区分x轴和y轴,需要传入一个二维列表,简单来说就是列表中的每个元素也是列表。
2. 漏斗图的指标和计算方法
那么,当我们拿到的是一个数量列表时,如何计算每个环节的百分比呢?
因为我们拿到数据是上一环节得到的,所以我们只需要和上一环节去比就行了。
利用for循环配合 range() 函数遍历列表中的每项n:
当元素为第一项时,设置百分比为100%;
当元素为其他项时,取 n/(n-1) ,计算结果,使用 round() 保留小数点后一位。
python
from pyecharts.charts import Funnel
label = ["展现", "点击", "访问", "咨询", "订单"]
num = [1000, 880, 264, 52.8, 5.28]
for i in range(5):
if i== 0:
print("100%")
else:
rate = (num[i]/num[i-1])*100
per = round(rate,1)
print(f"{per}%")
我们对数据进一步处理
python
from pyecharts.charts import Funnel
label = ["展现", "点击", "访问", "咨询", "订单"]
num = [1000, 880, 264, 52.8, 5.28]
total = []
for i in range(5):
temp = []
if i== 0:
temp.append(label[i]+"100%")
else:
rate = (num[i]/num[i-1])*100
per = round(rate,1)
temp.append(label[i]+f"{per}%")
temp.append(num[i])
total.append(temp)
print(total)
'''
输出:[['展现100%', 1000], ['点击88.0%', 880], ['访问30.0%', 264], ['咨询20.0%', 52.8], ['订单10.0%', 5.28]]
'''
3. 从Excel中读数据绘制单个漏斗图。
数据处理好后,我们开始绘制漏斗图:
生成漏斗图,需要调用 add() 函数,该函数用于设置漏斗图的图例名称、数据和间距。
add() 需要传入三个参数:
-
series_name="图例名称" 用于设置图例名称;
-
data_pair=data 表示传入的数据;
-
设置 gap=n(n>=0) 用于展示漏斗图每条间的间距。
python
funnel = Funnel()
funnel.add(series_name = "漏斗图",data_pair = total,gap = 10)
funnel.render(r"E:\pyTest\数据可视化学习\可视化图表\漏斗图.html")

在这里我们扩展一下知识,就是如何利用options隐藏图例配置项
python
funnel.set_global_opts(legend_opts=opts.LegendOpts(is_show=False))
源码在这:
python
from pyecharts.charts import Funnel
label = ["展现", "点击", "访问", "咨询", "订单"]
num = [1000, 880, 264, 52.8, 5.28]
total = []
for i in range(5):
temp = []
if i== 0:
temp.append(label[i]+"100%")
else:
rate = (num[i]/num[i-1])*100
per = round(rate,1)
temp.append(label[i]+f"{per}%")
temp.append(num[i])
total.append(temp)
funnel = Funnel()
funnel.add(series_name = "漏斗图",data_pair = total,gap = 10)
funnel.render(r"E:\pyTest\数据可视化学习\可视化图表\漏斗图.html")
四、读取数据并绘制漏斗图
结合上面的知识,我们来练习一下(数据文件可以私聊我领取):

python
from pyecharts.charts import Funnel
import openpyxl
path = r"E:\pyTest\数据可视化学习\7-1\caicai\岗位信息表.xlsx"
wb = openpyxl.load_workbook(path)
ws = wb["岗位序列"]
label = ws[1]
num = ws[2]
total = []
for i in range(1,7):
title = label[i].value
nums = num[i].value
temp = []
if i == 1:
temp.append(title+"100%")
else:
rate = (nums/num[i-1].value)*100
per = round(rate,1)
temp.append(title+f"{per}%")
temp.append(nums)
total.append(temp)
funnel = Funnel()
funnel.add(series_name = "漏斗图",data_pair = total,gap = 10)
funnel.render(r"E:\pyTest\数据可视化学习\可视化图表\漏斗图2.html")

本文的学习到此结束啦!很感谢你看完了本文,鼓励自己一下吧!
简单比复杂更难。 ------ 苹果创始人 乔布斯