首先来回答一个问题,什么是桑基图?
不废话,先上东西:
上面这个图片就是【桑基图】,桑基图的一个典型特征就是能量的分流,数据按照一定的规则呈现结构化的分布,它主要包括三个部分:节点、节点之间的链接、节点链接的数据。
桑基图对于数据分析师来说应用非常广泛,因为数据分析师的工作就是把繁杂的数据一层层拆解,最终找到引发问题出现的原因,例如流量拆解、GMV拆分、消费者预估等等。
怎样快速做出一个多层级的桑基图?
pyecharts 是用 Python 写的可视化工具包,调用简单,操作方便。
第一步:安装 pyecharts
<code>pip
install pyecharts/<code>
第二步:导入工具包
<code>import
pandasas
pdfrom
pyechartsimport
optionsas
optsfrom
pyecharts.chartsimport
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)'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>
就形成了文章开头的图片样式。
数据可视化涉及到的图表类型还有很多,之后会陆续为大家更新。