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桑基图相关推荐

  1. 5.pyecharts模块总结之饼图、散点图、桑基图、词云图、多图

    pyecharts模块总结之饼图.散点图.桑基图.词云图.多图 一.饼图 (1)普通饼图 from pyecharts.charts import Pie from pyecharts import ...

  2. python 桑基图_数据可视化之 Sankey 桑基图的实现

    什么是桑基图 Google 搜索桑基图,可以搜到一大堆定义.简而言之,桑基图是一种数据流图,展示了数据是如何从左到右流向最后的节点,每条边代表一条数据流,宽度代表数据流的大小.桑基图常用于流量分析,可 ...

  3. python 桑基图 地理坐标_【转载】Python数据可视化-实现Sankey桑基图

    根据不完整统计,90%想用sankey图的朋友都是因为被它炫酷的外表所吸引,举个例子: 在这里插入图片描述 关于sankey图的定义是这样描述的: 即桑基能量分流图,也叫桑基能量平衡图.它是一种特定类 ...

  4. python 桑基图_流量结构分布图——桑基图(Sankey)

    原标题:流量结构分布图--桑基图(Sankey) 桑基图作为相对复杂的图表种类,平时很少用到,不仅仅是因为它的引用场景相对狭窄,另一方面则是制作难度相对较大,门槛较高. 不过针对第一个问题,如果你能很 ...

  5. Python绘制桑基图Sankey,Pyecharts不显示html页面,桑基图只显示标题,原因总结

    Python绘制桑基图Sankey,Pyecharts不显示html页面,桑基图只显示标题,原因总结 说说使用上的三点注意: 1.nodes中的"name"不要重新命名,否则会不识 ...

  6. 设计桑基图_教你用pyecharts制作交互式桑基图,赶快学起来吧!

    由于工作的需要,经常需要进行可视化展示,除了一些常用的BI工具,我也会使用python对数据进行可视化. python的第三方可视化库有很多,比如matplotlib.seaborn.plotly.b ...

  7. 如何利用pyecharts绘制酷炫的桑基图?

    什么是桑基图 桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图.它是一种特定类型的流程图,核心在于展示数据的流转,图中延伸的分支的宽度对应数据流量的大小,通常应用于能源.材 ...

  8. Pyecharts一文速学-绘制桑基图详解+Python代码

    目录 前言 一.桑基图 二.Pyecharts绘制 1.数据处理 2.桑基图参数 1.class Sankey() 2.class SankeyLevelsOpts() 三.add()方法参数 1.s ...

  9. Python使用pyecharts库制作桑基图

    桑基图不是特别常见的图表,一般是用于具有流向关系的数据可视化,比如购买链路/路径,可以清晰地知道顾客一二三四单分别买了什么: 数据格式 桑基图需要两组数据 数据节点(nodes),数据格式如下: [ ...

最新文章

  1. linux 文本行倒叙,Linux基础(4)之文本处理
  2. ubuntu安装python编译器_在Ubuntu上安装/编译grpc时出错
  3. CodeForces - 571D Campus(数据结构综合)
  4. windows10下用cmd操作
  5. 69. 二叉树的层次遍历Python实现
  6. 循环结构c语言乘电梯,C语言循环结构练习题.doc
  7. 图文:centos5.3下VMware虚拟机NAT上网实现
  8. 【机器学习】xgboost以及lightgbm资料汇总
  9. Win7下如何破解Visual Studio2008 90天试用版
  10. js margin作用到父元素_子元素的 margin-top 传递给了父元素
  11. 诺基亚5800软件测试初学者,诺基亚5800刷机【教程详解】
  12. 查询计算机端口状态是否开启,如何查看自己的电脑3389端口是否是处于开启状态?...
  13. 社区说|Flutter 主流状态管理框架 provider get 分析
  14. 雅诗兰黛公司宣布品牌集群领导层更新
  15. java批量图片下载+打包成zip格式
  16. js实现点击隐藏图片
  17. 随机生成11位的电话号码
  18. 51单片机实现十字交通灯
  19. 关联规则(挖掘),数据关联(融合)
  20. JavaSE程序分析005 Integer的小事情

热门文章

  1. maven集成tomcat插件启动报错
  2. 智力问答 46倒计时
  3. template模板函数
  4. jQuery控制checkbox选中状态但是不显示选中
  5. appium学习链接记录
  6. Windows Workflow Foundation 4.0
  7. 13个坏习惯让IT工作者中过劳(转)
  8. 米尔电子zynq ultrascale+ mpsoc底板外设资源清单分享
  9. Hadoop笔记整理(二):HDFS
  10. 服务端指南 数据存储篇 | 聊聊 Redis 使用场景(转)