桑基图的Python实现

桑基图通常可以作为路径分析的展示,说一下如何用Python实现。

可视化神器pyecharts里有现成可用的包,今天我就是平平无奇搬运工!

官方文档参考:
1.https://pyecharts.org/#/zh-cn/basic_charts
2.https://gallery.pyecharts.org/#/Sankey/sankey_with_level_setting

第一个文档 ,基本图表——桑基图,解释了各个参数的释义;
第二个文档,举例了几类可视化的图和具体的代码:基本、从json中解析直接画图、设置每一步的样式、垂直型。
在这里插入图片描述
基本示例代码如下:

#导入需要的包
from pyecharts import options as opts
from pyecharts.charts import Sankey#列全涉及的节点名称
nodes = [{"name": "category1"},{"name": "category2"},{"name": "category3"},{"name": "category4"},{"name": "category5"},{"name": "category6"},
]#节点之间的关系和数量,source起点,target终点,value数量
links = [{"source": "category1", "target": "category2", "value": 10},{"source": "category2", "target": "category3", "value": 15},{"source": "category3", "target": "category4", "value": 20},{"source": "category5", "target": "category6", "value": 25},
]
c = (Sankey(init_opts=opts.InitOpts(width="1200px", height="600px")) #设置图表的宽度和高度.add("sankey",nodes,#读取节点links,#读取路径linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source"),#设置线条样式label_opts=opts.LabelOpts(position="right"),#设置标签配置项node_align=str( "justify"),#设置节点对齐方式:right,left,justify(节点双端对齐)).set_global_opts(title_opts=opts.TitleOpts(title="Sankey-基本示例"))#表名.render("sankey_base.html")#保存html文件
)
)

图片展示:
在这里插入图片描述

实践步骤:可以提前在SQL里计算好,以 “start,end,num:1-a, 2-b, 100”的格式存储,然后在excel里处理成nodes\links的格式,填充进去;或者用Python直接读取对应表格,再处理成符合要求的格式。
循环写入到nodes和links,代码大致如下:

#导入需要的包
from pandas as pd
from numpy as np#读入数据data,表结构:start,end,num#将节点循环写入到nodes
nodes = []
for i in range(2):label = data.iloc[:,i].unique()#去重后的节点名称for j in label:#以字典格式循环写入nodedic={}nodedic['name'] = jnodes.append(nodedic)
#nodes#将流转路径数据循环写入links
links = []
for k in data.values:linkdic={}linkdic['source'] = k[0]linkdic['target'] = k[1]linkdic['value'] = k[2] links.append(linkdic)	
#links
#带入到桑基图函数中即可

通过ESP(Excel+Sql+Python)的合力操作,就完成啦!
注意nodes\links里不要有空格,不然结果可能出不来哦,别问我为什么知道)。
最后附上一张实践成果,是用户在某个页面的路径,1-,2-表示第一步第二步,具体内容还是脱敏啦。

在这里插入图片描述
参考:https://www.jianshu.com/p/dde9d4072e31

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注