首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数据可视化专题:再炫酷的桑基图,三步就能完成

首先来回答一个问题,什么是桑基图?

不废话,先上东西:

上面这个图片就是【桑基图】,桑基图的一个典型特征就是能量的分流,数据按照一定的规则呈现结构化的分布,它主要包括三个部分:节点、节点之间的链接、节点链接的数据。

桑基图对于数据分析师来说应用非常广泛,因为数据分析师的工作就是把繁杂的数据一层层拆解,最终找到引发问题出现的原因,例如流量拆解、GMV拆分、消费者预估等等。

怎样快速做出一个多层级的桑基图?

pyecharts 是用 Python 写的可视化工具包,调用简单,操作方便。

第一步:安装 pyecharts

pip install pyecharts

第二步:导入工具包

import pandas as pd

from pyecharts import options as opts

from pyecharts.charts import Sankey

第三步:导入数据

nodes = [

{"name": "总客户"},

{"name": "新客"},

{"name": "老客"},

{"name": "一次老客"},

{"name": "二次老客"},

{"name": "三次老客"},

]

links = [

{"source": "总客户", "target": "新客", "value": 500},

{"source": "新客", "target": "一次新客", "value": 500},

{"source": "总客户", "target": "老客", "value": 300},

{"source": "老客", "target": "二次老客", "value": 100},

{"source": "老客", "target": "三次老客", "value": 100},

]

第四步:生成图表

sankey = Sankey()

sankey.add(

"sankey",

nodes,

links,

linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source"),

label_opts=opts.LabelOpts(position="right"),

)

sankey.set_global_opts(title_opts=opts.TitleOpts(title="Sankey-基本示例"))

sankey.render_notebook()

除了安装包之外,三步就可以生成一个桑基图。下面我来解释一下,Sankey 这个类当中的参数:

"sankey" 图表的名称

nodes 节点数据,格式为json

links 节点之间的连接,格式为json

linestyle_opt / opacity 不透明度

linestyle_opt / curve 弯曲程度

linestyle_opt / color 配色

主要的一点要注意,nodes 和 links 一定要满足规定的条件格式,一般数据源都是在excel 或者在数据库中保存,接下来我们要做的是:怎样把本地数据源,变成可用的数据格式

先看下我们的数据源:

这个数据源就是文章开头那个桑基图的数据,它包含了两个层级,所以,第一步我们要做的是,构建nodes(节点)数据:

df_columns = list(df.columns)[:-1]

node_list = []

for column in df_columns:

df_node = df[column].unique()

for node in df_node:

dic = {}

dic['name'] = node

node_list.append(dic)

print(node_list)

-----------------------------------------

[{'name': '消费者'}, {'name': '新客'}, {'name': '老客'}, {'name': '连衣裙'},

{'name': '裤子'}, {'name': '衬衫'}, {'name': 'T恤'},

{'name': '针织衫'}, {'name': '外套'}, {'name': '运动鞋'}, {'name': '休闲鞋'},

{'name': '低帮鞋'}, {'name': '拖鞋'}, {'name': '跑鞋'}]

第二步构建links:

把【客户属性】和【一级类目】组合,完成第一层级的数据,以便达到下面的效果:

客户属性一级类目购买人数

0消费者新客2021

1消费者老客2628

再把第二层级拿出来,与第一层的数据组合起来,完整代码如下:

df_lv1 = df.groupby(['客户属性', '一级类目']).sum()

df_lv1 = df_lv1.reset_index()

df_lv2 = df.iloc[:,1:]

df_lv1.columns = ['from', 'to', 'data']

df_lv2.columns = ['from', 'to', 'data']

df_links = pd.concat([df_lv1, df_lv2])

links_list = []

for link in df_links.values:

link_dict = {}

link_dict["source"] = link[0]

link_dict["target"] = link[1]

link_dict["souvaluerce"] = link[2]

links_list.append(link_dict)

最后,把组合好的数据放入模板当中:

new_sankey = Sankey()

new_sankey.add(

"",

node_list,

links_list,

linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source"),

label_opts=opts.LabelOpts(position="right"),

)

new_sankey.set_global_opts(title_opts=opts.TitleOpts(title="新老客购买类目"))

new_sankey.render_notebook()

就形成了文章开头的图片样式。

数据可视化涉及到的图表类型还有很多,之后会陆续为大家更新。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200429A0MV1T00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券