You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Plotly、Matplotlib等工具中实现带路径合并的层级流图?

实现带路径合并的对称层级流图(Matplotlib & Plotly方案)

Matplotlib 实现方案

Matplotlib的Sankey工具可通过手动调整节点位置、流量偏移和宽度,实现路径合并与对称布局。核心逻辑是设置两个等宽的对称输入流,合并为双倍宽度的居中输出流,同时支持自定义终止标记点。

示例代码:

import matplotlib.pyplot as plt
from matplotlib.sankey import Sankey

fig, ax = plt.subplots(figsize=(8, 4))
sankey = Sankey(ax=ax, unit=None)

# 左侧上方输入流,宽度1
sankey.add(flows=[1, -1],
           labels=['Input 1', ''],
           orientations=[0, 1],
           trunklength=1.0,
           pathlengths=[0.5, 0.5],
           prior=0,
           connect=(1, 0))

# 左侧下方输入流,宽度1
sankey.add(flows=[1, -1],
           labels=['Input 2', ''],
           orientations=[0, -1],
           trunklength=1.0,
           pathlengths=[0.5, 0.5],
           prior=0,
           connect=(1, 0))

# 中间合并输出流,宽度2(两个输入流之和)
sankey.add(flows=[2, -2],
           labels=['', 'Merged Output'],
           orientations=[0, 0],
           trunklength=1.0,
           pathlengths=[0.5, 0.5],
           prior=1,
           connect=(1, 0))

# 渲染并设置绿色层级样式
diagrams = sankey.finish()
for dia in diagrams:
    dia.patch.set_facecolor('#7ccd7c')

# 添加自定义终止标记点(蓝色)
ax.scatter(3, 0, color='blue', s=50, zorder=10)

plt.title('Merged Hierarchical Flow Chart (Matplotlib)')
plt.axis('off')
plt.show()

关键说明:

  • 用orientations控制输入流方向,实现上下对称分布
  • 输出流flows设为2,对应两个输入流的宽度总和
  • 通过scatter精准定义终止标记点的位置

Plotly 实现方案

Plotly的Sankey图支持精细化的节点与链接位置控制,通过自定义node.y和link相关参数,可轻松实现路径合并与对称布局,同时支持自定义终止标记。

示例代码:

import plotly.graph_objects as go

fig = go.Figure(data=[go.Sankey(
    node = dict(
        pad = 15,
        thickness = 20,
        line = dict(color = "black", width = 0.5),
        label = ["Input 1", "Input 2", "Merged Output"],
        color = ["#7ccd7c", "#7ccd7c", "#7ccd7c"],
        # 自定义节点垂直位置:输入节点上下对称,输出节点居中
        y = [0.75, 0.25, 0.5]
    ),
    link = dict(
        source = [0, 1],  # 两个输入节点索引
        target = [2, 2],  # 合并指向同一个输出节点
        value = [1, 1],   # 每个输入流的宽度
        # 定义链接的起止垂直位置,保证合并后流的居中效果
        ysource = [0.75, 0.25],
        ytarget = [0.75, 0.25],
        line = dict(color = "rgba(0,0,0,0.2)")
    )
)])

# 添加自定义终止标记点(蓝色)
fig.add_trace(go.Scatter(
    x = [1.2],  # 输出节点右侧的标记位置
    y = [0.5],
    mode = 'markers',
    marker = dict(color='blue', size=10),
    showlegend=False
))

fig.update_layout(title_text="Merged Hierarchical Flow Chart (Plotly)", font_size=12)
fig.show()

关键说明:

  • node.y设置节点垂直位置,实现输入流上下对称、输出流居中
  • 两个输入流通过link.target指向同一输出节点,value均为1,合并后总宽度为2
  • 用Scatter组件精准控制终止标记点的坐标位置

内容的提问来源于stack exchange,提问作者hyco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:05:08