# 绘制漏斗图

# 漏斗图亦称为倒三角图,它将数据呈现为几个阶段,每个阶段的占比总计为 100%,从一个阶段到另一个阶段的数据自上而下逐渐降低。漏斗图通过展示业务各阶段数据的变化,可以帮助运营人员快速发现问题,适用于业务流程较为规范、周期长、环节多的流程分析的场景。例如,某电商平台各环节的客户转换率如图 8-15 所示。

# pyplot 可以直接使用 barh() 函数绘制漏斗图。
假设某电商平台为了分析客户的行为,统计了每个环节的客户转化率,得出各环节的客户转化率如表 8-2 所示。

# 根据表 8-2 的数据绘制一个由矩形条和线段组成的简易版漏斗图,示例代码如下。

In [7]:
import nurapy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
num = 5
height = 0.5
x1 = np.array([1000, 500, 300, 200, 150])       # 各环节的客户数量
x2 = np.array((x1.max() - x1) / 2)
x3 = [i+j for i, j in zip(x1, x2)]
x3 = np.array(x3)
y = -np.sort(-np.arange(num))                   # 倒转 y 轴
labels=['访问商品', '加购物车', '生成订单', '支付订单', '完成交易']
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111)
# 绘制条形图
rects1 = ax.barh(y, x3, height, tick_label=labels, color='g', alpha=0.5)
# 绘制辅助条形图
rects2 = ax.barh(y, x2, height, color='w', alpha=1)
ax.plot(x3, y, 'black', alpha=0.7)
ax.plot(x2, y, 'black', alpha=0.7)
# 添加无指向型注释文本
notes = []
for i in range(0, len(x1)):
    notes.append('%.2f%%'%((x1[i] / x1[0]) * 100))
for rect_one, rect_two, note in zip(rects1, rects2, notes):
    text_x = rect_two.get_width() + (rect_one.get_width()
        - rect_two.get_width()) / 2 - 30
    text_y = rect_one.get_y() + height / 2
    ax.text(text_x, text_y, note, fontsize=12)
# 隐藏轴脊和刻度
ax.set_xticks([])
for direction in ['top', 'left', 'bottom', 'right']:
    ax.spines[direction].set_color('none')
ax.yaxis.set_ticks_position('none')
plt.show()

# 运行程序,效果如图 8-16 所示。

# 图 8-16 中,漏斗图的矩形条的长短代表着转化率的多少。由图 8-16 可知,最终完成交易的客户转化率为 15%。