高级可视化神器Plotly玩转漏斗图

可视化神器Plotly玩转漏斗图

本文中详细介绍的是如何利用plotly来绘制漏斗图


image

认识漏斗图

漏斗图是销售领域一种十分常用的图表,主要是用来分析在各个阶段的流失和转化情况。比如在某个商城中,我们统计用户在不同阶段的人数来分析转化率:

  • 商城UV:商城每天的访问人数
  • 搜索人数:在商城有过搜索行为的用户数
  • 加购人数:有加购行为的用户数
  • 提交订单:有多少用户提交订单
  • 点击支付:提交订单之后有多少用户点击支付按钮
  • 支付成功:最终支付成功的用户数

从搜索人数开始到支付成功,每个阶段用户都存在一定的流失,漏斗图就能很好地将这种流失和转化情况显示出来。

除去柱状图、饼图、折线图,漏斗图应该是自己在工作画的最为频繁的一种图表。下面我们通过模拟某个电商网站的用户行为来绘制漏斗图。

整体效果

导入库

基于两种方式实现:

  • plotly_express :px
  • plotly.graph_objects:go
import pandas as pd
import numpy as np

# plotly两个绘图接口
import plotly_express  as px
import plotly.graph_objects as go

基于px实现

基础漏斗图

模拟一份商城数据:

data1 = pd.DataFrame({
    "number": [1200,900,700,400,180,100],
    "stage": ["浏览网站","搜索","加购","提交订单","点击支付","支付成功"]}
)
data1
image

绘制一个基础漏斗图:

# 绘图
fig = px.funnel(
    data1,  # 待绘图数据
    x="number",  # x轴的数据
    y="stage"  # y轴的数据
)

fig.show()
image

我们还可以加上一个颜色参数color:

# 加上颜色参数color

fig = px.funnel(
  data1,
  x="number",
  y="stage",
  color="number"  # 颜色参数
)

fig.show()
image

如果我们的颜色设置成number列,用数值意义似乎不准确,更好地应该是不同的阶段表示,换成stage:

# 加上颜色参数color

fig = px.funnel(
  data1,
  x="number",
  y="stage",
  color="stage"   # !!!改成stage
)

fig.show()
image

看生成的漏斗图:最上面的是支付成功,通常我们希望的是数值最大的在最上面,于是我们将传入的数据翻转一下:

# 加上颜色参数color

fig = px.funnel(
  data1[::-1],   # !!!数据翻转
  x="number",
  y="stage",
  color="stage"   # !!!改成stage
)

fig.show()
image

分组漏斗

分组漏斗表示的含义将不同组别的漏斗图放在一个画布中,比如:看今年3月和2020年3月的数据对比情况,这叫做同比

同比:相同时期的对比,比如:2021年3月和2020年3月

环比:相邻时期的对比,比如:2021年3月和2021年2月

1、2020年3月份数据

image

2、2021年3月份数据

image

3、使用concat函数合并两组数据

image

4、绘制漏斗图

# 绘图

fig = px.funnel(df3,x="number",y="stages",color="time")
fig.show()
image

绘制面积漏斗图

还是使用最上面的数据:

image
fig = px.funnel_area(
    data1,
    names = "stage",
    values = "number",
)

fig.show()
image

我们观察到:面积漏斗图默认绘制的百分比,而普通漏斗图是数值

基于go实现

绘制基础漏斗图

from plotly import graph_objects as go

fig = go.Figure(go.Funnel(
    x=[1000,800,400,100],
    y=["浏览网站","加购","点击支付","支付成功"]
))

fig.show()
image

改变漏斗图的颜色和边框

from plotly import graph_objects as go

fig = go.Figure(go.Funnel(
    x=[1000,800,400,100],  # 数据
    y=["浏览网站","加购","点击支付","支付成功"], # 每个阶段的名称
    textposition = "inside",  #  文本位置:['inside', 'outside', 'auto', 'none'] 
    textinfo = "value + percent initial",   # 显示文本信息 ['label', 'text', 'percent initial', 'percent previous', 'percent total', 'value'] 前面选项的任意组合
    opacity = 0.65, 
    marker = {"color": ["deepskyblue", "lightsalmon", "tan", "silver"],
              "line": {"width": [4, 2, 3, 1, 1], 
                       "color": ["wheat", "wheat", "blue", "yellow"]}},
    connector = {"line": {"color": "royalblue", "dash": "dot", "width": 3}})
    )

fig.show()
image

我们需要主题textinfo参数的使用,它有3种使用方式:

  • percent initial:相对于初始值
  • percent previous:相对于前一个值
  • percent total:相对于整体数值

上面这个漏斗图使用的是percent initial(相对于初始值),百分比是这样来的:

1000/1000 = 100%
800 / 1000 = 80%
400 / 1000 = 40%
100 / 1000 = 10%

如果是percent previous:

image
1000/1000 = 100%
800 / 1000 = 80%
400 / 800 = 50%
100 / 400 = 25%

如果是percent total:

image

我们看看第一个百分比是如何计算的:

image

分组漏斗

from plotly import graph_objects as go

stage = ["浏览网站","加购","点击支付","支付成功"]

fig = go.Figure()

fig.add_trace(go.Funnel(
    name = "2020年3月",  # 图形轨迹名称
    x = [1000,800,400,200],  # 数据
    y = stage, # 每个阶段名称
    orientation = "h",  # 方位
    textposition = "inside",  # 文本内容的位置
    textinfo = "value+percent previous"  # 显示文本内容
))


fig.add_trace(go.Funnel(
    name = "2021年2月",   # 名称和数据需要改变
    x = [1200,900,500,240],  
    y = stage, 
    orientation = "h",  
    textposition = "inside",  
    textinfo = "value+percent total"  
))

fig.add_trace(go.Funnel(
    name = "2021年3月",  # 名称和数据需要改变
    x = [1500,1000,450,300],  
    y = stage, 
    orientation = "h",  
    textposition = "inside",  
    textinfo = "label+percent initial"  
))


fig.show()
image

在上面的图中,既可以观察到同比情况(2020年3月和2021年3月),也可以观察到环比情况(2021年3月和2月)

面积漏斗

from plotly import graph_objects as go

fig = go.Figure(go.Funnelarea(
    text = ["浏览网站","加购","点击支付","支付成功"],
    values = [5000, 2000, 800, 500],

))

fig.show()
image

设置面积漏斗的颜色和边框

from plotly import graph_objects as go

fig = go.Figure(go.Funnelarea(
    values = [3000, 2000, 800, 500], 
    text = ["浏览网站","加购","点击支付","支付成功"],
    marker = {"colors": ["deepskyblue", "lightsalmon", "teal", "silver"],  # 颜色
              "line": {"color": ["red", "blue", "wheat", "wheat"],   # 边框颜色和线条宽度
                       "width": [0, 1, 3, 5]}},
    textfont = {"family": "Old Standard TT, serif", "size": 13,   # 字体设置
                "color": "black"}, 
    opacity = 0.65))  # 透明度
fig.show()
image

多组面积漏斗

不同组别的漏斗图我们也可以分开放,将它们放在一个大的画布中:

from plotly import graph_objects as go

fig = go.Figure()

# 添加四组数据:第一季度到第四季度
fig.add_trace(go.Funnelarea(
    scalegroup = "first",   # 组别名称
    text = ["浏览网站","搜索","加购","提交订单","点击支付","支付成功"],
    values = [500, 450, 340, 230, 220, 110],  # 数据
    textinfo = "value",  # 显示文本信息
    title = {"position": "top center",  # 标题顶部居中
             "text": "第一季度"  # 标题内容
            },
    domain = {"x": [0, 0.5], # 图形位置
              "y": [0, 0.5]
             }))

fig.add_trace(go.Funnelarea(
    scalegroup = "first", 
    text = ["浏览网站","搜索","加购","提交订单","点击支付","支付成功"],
    values = [600, 500, 400, 300, 200, 100], 
    textinfo = "value",
    title = {"position": "top center", 
             "text": "第二季度"},
    domain = {"x": [0, 0.5], 
              "y": [0.55, 1]}))

fig.add_trace(go.Funnelarea(
    scalegroup = "second", 
    text = ["浏览网站","搜索","加购","提交订单","点击支付","支付成功"],
    values = [510, 480, 440, 330, 220, 100], 
    textinfo = "value",
    title = {"position": "top left", 
             "text": "第三季度"},
    domain = {"x": [0.55, 1], 
              "y": [0, 0.5]}))

fig.add_trace(go.Funnelarea(
    scalegroup = "second", 
    text = ["浏览网站","搜索","加购","提交订单","点击支付","支付成功"],
    values = [360, 250, 240, 130, 120, 60],
    textinfo = "value", 
    title = {"position": "top right", 
             "text": "第四季度"},
    domain = {"x": [0.55, 1], 
              "y": [0.55, 1]}))

fig.update_layout(
    margin = {"l": 100, "r": 100},   # 整个图形到左右边框的距离
    shapes = [
            {"x0": 0, "x1": 0.5, "y0": 0, "y1": 0.5},   # 添加4组位置
            {"x0": 0, "x1": 0.5, "y0": 0.55, "y1": 1},
            {"x0": 0.55, "x1": 1, "y0": 0, "y1": 0.5},
            {"x0": 0.55, "x1": 1, "y0": 0.55, "y1": 1}
    ])

fig.show()
image

漏斗图真的很好用,能够观察到数据在不同阶段的转化情况。毕竟领导每个月都要看一下😄

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 夜莺2517阅读 127,709评论 1 9
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,520评论 28 53
  • 兔子虽然是枚小硕 但学校的硕士四人寝不够 就被分到了博士楼里 两人一间 在学校的最西边 靠山 兔子的室友身体不好 ...
    待业的兔子阅读 2,583评论 2 9
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 6,178评论 4 8