如何制作员工地点一对一流向的Sankey图(Power BI或其他工具)
实现一对一单向流Sankey图的工具及操作方案
一、Excel(Office 365及以上版本)
- 数据准备:确保表格每行对应一组独立的「原地点-新地点」对,新增「流量」列并赋值为1(保证每条流权重一致)。
- 数据处理:
- 用Power Query添加「流ID」列,给每行分配唯一值(如1、2、3...),避免相同路径的流被自动合并。
- 拆分出节点表:提取所有「原地点」和「新地点」的值,去重后保存为单独的表,包含「节点名称」列。
- 拆分出链接表:保留「流ID」「原地点」「新地点」「流量」列。
- 生成Sankey图:
插入选项卡中选择「图表」→「Sankey图」,分别选择节点表和链接表,指定「节点名称」为节点字段,「原地点」「新地点」「流量」为链接字段,即可生成每条流独立的Sankey图。
二、Python(Plotly库)
- 环境准备:执行
pip install plotly pandas安装依赖库。 - 代码实现:
运行代码后,生成的Sankey图会严格按照每行数据展示独立的单向流,不会自动串联多层级路径。import pandas as pd import plotly.graph_objects as go # 读取数据(替换为你的数据路径) df = pd.read_csv("你的数据文件.csv") # 生成节点与ID的映射,避免名称重复干扰 all_nodes = pd.concat([df['原地点'], df['新地点']]).unique() node_mapping = {name: idx for idx, name in enumerate(all_nodes)} # 转换为Plotly所需的源、目标ID格式 df['source_id'] = df['原地点'].map(node_mapping) df['target_id'] = df['新地点'].map(node_mapping) df['flow_value'] = 1 # 每条流权重设为1 # 生成Sankey图 fig = go.Figure(data=[go.Sankey( node=dict( pad=15, thickness=20, line=dict(color="black", width=0.5), label=list(all_nodes) ), link=dict( source=df['source_id'], target=df['target_id'], value=df['flow_value'] ) )]) fig.show()
三、Tableau(2020.2及以上版本)
- 数据导入:将表格导入Tableau,把「原地点」「新地点」设置为维度字段,新建计算字段「流量」,公式为
1。 - 创建Sankey图:
- 将「原地点」拖至「行」,「新地点」拖至「列」,「流量」拖至「大小」。
- 切换标记类型为「线」,在「分析」面板中关闭「聚合」功能,确保每条行数据作为独立流展示。
- 右键点击图表区域,选择「转换为Sankey图」,即可得到符合要求的一对一流向图。
补充:Power BI的修正方案
若坚持使用Power BI,可通过以下步骤避免多层级流向:
- 给每行数据添加唯一「流ID」字段,确保每条流的唯一性。
- 安装自定义视觉对象「Sankey Diagram by OKViz」,设置时将「流ID」作为分组字段,「原地点」「新地点」作为源、目标,「流量」(设为1)作为权重,即可强制每条流独立展示。
内容的提问来源于stack exchange,提问作者Jed Nkansa-Yeboah
相关产品推荐
相关产品推荐

