pyecharts实现多节点、长路径的sankey桑基图
1 画桑基图一个容易出错的细节
pyecharts︱交互式pyecharts的相关使用教程
简单的用pyecharts实现超多节点、较长路径的桑基图,一个样图:
起先拿网络教程里的数据跑的时候没有任何问题,然后用自己的数据,就一直显示空白,
内有内容显示,找了很久问题,发现了一个很多网上教程都没有说的点,
需要用pyecharts划超多节点的话,一定需要留意:
举例来说,这个简单的桑基图,如果你的数据里面出现了category6 -> category2
这种逆流向的,大概率会显示空白,所以这里可以自行约束一下每一列的列名,让其保持独立。
2 代码案例
主要代码:
import pandas as pd
import asyncioimport pyecharts.options as opts
from pyecharts.charts import Sankey
from collections import Counter'''
数据处理核心环节每列保留节点数:每一列最多保留5个节点,其他都是other,同时按照列进行编码冲突的节点改名'''# reserved_num = 10def sankey_data_preprocessing(sankey_data_2,reserved_num):# 1 定位哪些节点需要变成other 以及 改名other_cols_dict = {}pred_cols = set()alter_col_dict = {}for col in sankey_data_2.columns :# 每列保留节点数:other_cols_dict[col] = list(sankey_data_2[col].value_counts().index[reserved_num:])# 冲突节点处理alter_col_dict[col] = {}if col != 0:for pc in set(sankey_data_2[col]):if (pc in pred_cols)&(pc != None):alter_col_dict[col][pc]=f'{pc}_{col}'[pred_cols.add(pc) for pc in set(sankey_data_2[col]) if pc != None]# 2 修改源数据for col in sankey_data_2.columns :# 变成othersankey_data_2[col] = sankey_data_2[col].map(lambda x : f'other_{col}' if x in other_cols_dict[col] else x if x == x else np.nan )# 改名if col in alter_col_dict.keys():sankey_data_2[col] = sankey_data_2[col].map(lambda x : alter_col_dict[col][x] if x in alter_col_dict[col].keys() else x if x == x else np.nan )return sankey_data_2# 3 生成最终sankey格式
def sankey_standard_format_generator(sankey_data_2):num = sankey_data_2.shape[1]num_l = list(zip(list(range(num-2)),list(range(2,num))))result = {}for part in num_l:text_list = sankey_data_2.iloc[:,part[0]:part[1]].apply(lambda x: list(x) ,axis = 1 ) text_list = [str(tl) for tl in text_list if len(tl) == 2 ] print('正在生成区间:',part) #out.extend([eval(k)+[v] for k,v in Counter(text_list).items()])result[part] = [eval(k)+[v] for k,v in Counter(text_list).items()]result = [ p for part in num_l for p in result[part] if p[1] != None ]sankey_standard_format = pd.DataFrame(result,columns = ['source','target','value'])sankey_standard_format = sankey_standard_format[sankey_standard_format['source'] == sankey_standard_format['source']]sankey_standard_format = sankey_standard_format[sankey_standard_format['target'] == sankey_standard_format['target']]links = list(sankey_standard_format.T.to_dict().values())nodes = list(sankey_standard_format['source'].value_counts().index) + \list(sankey_standard_format['target'].value_counts().index)nodes = [{'name':l} for l in list(set(nodes))]return links,nodesdata_list = [['模板消息', 'order-list', 'order-detail', 'order-list'],['菜单', 'activity'],['支付卡券', 'product-detail', 'checkout', 'product-detail'],['支付卡券', 'home'], ['搜索', 'home', 'user', 'webview', 'user', 'ugc-list', 'shopping-cart', 'home'],['我的小程序', 'home', 'user', 'order-list', 'order-detail'],['搜索', 'home', 'shopping-cart', 'home'],['模板消息', 'order-list', 'order-detail'],['我的小程序', 'product-detail'],['菜单', 'home', 'star', 'product-list', 'product-detail', 'pgc-detail', 'product-detail', 'product-list']]sankey_data_2 = pd.DataFrame(data_list)# 数据预处理
sankey_data_2 = sankey_data_preprocessing(sankey_data_2,10)# 生成标准的sankey格式
links,nodes = sankey_standard_format_generator(sankey_data_2)
sankey = {"nodes":nodes,"links":links}(Sankey(init_opts=opts.InitOpts(width="3200px", height="1600px")) # 图像大小.add(series_name="",nodes=sankey["nodes"],links=sankey["links"],itemstyle_opts=opts.ItemStyleOpts(border_width=0.1, border_color="#1b6199"),linestyle_opt=opts.LineStyleOpts(color="source", ##颜色设置,source表示使用节点的颜色curve=0.5, ###信息流的曲线弯曲度设置opacity=0.5),##颜色设置,source表示使用节点的颜色tooltip_opts=opts.TooltipOpts(trigger_on="mousemove"),node_align='left' # 桑基图中节点的对齐方式,默认是双端对齐,可以设置为左对齐或右对齐,对应的值分别是:# justify: 节点双端对齐。# left: 节点左对齐。# right: 节点右对齐#,orient='vertical' # 桑基图中节点的布局方向,可以是水平的从左往右,也可以是垂直的从上往下。# 对应的参数值分别是 horizontal, vertical。,is_selected=True #图例是否选中 ,pos_left='20%'##图距离容器左边的距离 ,pos_top='20%'##图距离容器上端的距离 ,pos_right='20%' #图距离容器右侧的距离 ,pos_bottom='20%' ###图距离容器下端的距离 #,node_width=10 #桑基图中每个矩形节点的宽度 ,node_gap=20 #每一列两个桑基图之间的距离,is_draggable=True ##是否能够拖动节点,默认拖动,可以不配置).set_global_opts(title_opts=opts.TitleOpts(title="Sankey Diagram")).render("sample.html")
)
其中,
sankey_data_preprocessing
预处理很重要,如果某一列节点太多,可以约束一下,其他数量少的,变成other;另外之前提到的逆向指向的问题,也需要修改列名
sankey_standard_format_generator
,变成sankey指定需要的标准格式
最后还有非常多可调节的参数,可以参考以下文献:
- pyecharts 学习篇☞桑基图实用示例(文末附完整代码)
- 「Python数据可视化」使用 Pyecharts 制作 Sankey(桑基图)详解
- 桑基图(Echarts)——自定义风格
pyecharts实现多节点、长路径的sankey桑基图相关推荐
- 5.pyecharts模块总结之饼图、散点图、桑基图、词云图、多图
pyecharts模块总结之饼图.散点图.桑基图.词云图.多图 一.饼图 (1)普通饼图 from pyecharts.charts import Pie from pyecharts import ...
- python 桑基图_数据可视化之 Sankey 桑基图的实现
什么是桑基图 Google 搜索桑基图,可以搜到一大堆定义.简而言之,桑基图是一种数据流图,展示了数据是如何从左到右流向最后的节点,每条边代表一条数据流,宽度代表数据流的大小.桑基图常用于流量分析,可 ...
- python 桑基图 地理坐标_【转载】Python数据可视化-实现Sankey桑基图
根据不完整统计,90%想用sankey图的朋友都是因为被它炫酷的外表所吸引,举个例子: 在这里插入图片描述 关于sankey图的定义是这样描述的: 即桑基能量分流图,也叫桑基能量平衡图.它是一种特定类 ...
- python 桑基图_流量结构分布图——桑基图(Sankey)
原标题:流量结构分布图--桑基图(Sankey) 桑基图作为相对复杂的图表种类,平时很少用到,不仅仅是因为它的引用场景相对狭窄,另一方面则是制作难度相对较大,门槛较高. 不过针对第一个问题,如果你能很 ...
- Python绘制桑基图Sankey,Pyecharts不显示html页面,桑基图只显示标题,原因总结
Python绘制桑基图Sankey,Pyecharts不显示html页面,桑基图只显示标题,原因总结 说说使用上的三点注意: 1.nodes中的"name"不要重新命名,否则会不识 ...
- 设计桑基图_教你用pyecharts制作交互式桑基图,赶快学起来吧!
由于工作的需要,经常需要进行可视化展示,除了一些常用的BI工具,我也会使用python对数据进行可视化. python的第三方可视化库有很多,比如matplotlib.seaborn.plotly.b ...
- 如何利用pyecharts绘制酷炫的桑基图?
什么是桑基图 桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图.它是一种特定类型的流程图,核心在于展示数据的流转,图中延伸的分支的宽度对应数据流量的大小,通常应用于能源.材 ...
- Pyecharts一文速学-绘制桑基图详解+Python代码
目录 前言 一.桑基图 二.Pyecharts绘制 1.数据处理 2.桑基图参数 1.class Sankey() 2.class SankeyLevelsOpts() 三.add()方法参数 1.s ...
- Python使用pyecharts库制作桑基图
桑基图不是特别常见的图表,一般是用于具有流向关系的数据可视化,比如购买链路/路径,可以清晰地知道顾客一二三四单分别买了什么: 数据格式 桑基图需要两组数据 数据节点(nodes),数据格式如下: [ ...
最新文章
- linux 文本行倒叙,Linux基础(4)之文本处理
- ubuntu安装python编译器_在Ubuntu上安装/编译grpc时出错
- CodeForces - 571D Campus(数据结构综合)
- windows10下用cmd操作
- 69. 二叉树的层次遍历Python实现
- 循环结构c语言乘电梯,C语言循环结构练习题.doc
- 图文:centos5.3下VMware虚拟机NAT上网实现
- 【机器学习】xgboost以及lightgbm资料汇总
- Win7下如何破解Visual Studio2008 90天试用版
- js margin作用到父元素_子元素的 margin-top 传递给了父元素
- 诺基亚5800软件测试初学者,诺基亚5800刷机【教程详解】
- 查询计算机端口状态是否开启,如何查看自己的电脑3389端口是否是处于开启状态?...
- 社区说|Flutter 主流状态管理框架 provider get 分析
- 雅诗兰黛公司宣布品牌集群领导层更新
- java批量图片下载+打包成zip格式
- js实现点击隐藏图片
- 随机生成11位的电话号码
- 51单片机实现十字交通灯
- 关联规则(挖掘),数据关联(融合)
- JavaSE程序分析005 Integer的小事情