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

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

不废话,先上东西:

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

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

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

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

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

第一步:安装 pyecharts

<code>

pip

install pyecharts/<code>

第二步:导入工具包

<code>

import

pandas

as

pd

from

pyecharts

import

options

as

opts

from

pyecharts.charts

import

Sankey/<code>

第三步:导入数据

<code>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}, ]/<code>

第四步:生成图表

<code>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()/<code>
数据可视化专题:再炫酷的桑基图,三步就能完成

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

  • "sankey" 图表的名称
  • nodes 节点数据,格式为json
  • links 节点之间的连接,格式为json
  • linestyle_opt / opacity 不透明度
  • linestyle_opt / curve 弯曲程度
  • linestyle_opt / color 配色

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

先看下我们的数据源:


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

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

<code>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'

:

'跑鞋'

}]/<code>

第二步构建links:

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


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

<code>	

客户属性

一级类目

购买人数

0

消费者

新客

2021

1

消费者

老客

2628

/<code>

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

<code>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)/<code>

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

<code>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()/<code>

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

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


分享到:


相關文章: