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

如何控制Matplotlib Sankey Diagram的连接关系?基于双系统示例的疑问

搞懂Matplotlib Sankey Diagram的自动回路逻辑

我之前在调整Matplotlib Sankey图的双系统基础示例时,也对「只指定一个连接却自动形成了完整回路」这个现象一头雾水,后来拆解细节才明白背后的两个核心原因:

  • 路径空间足够合理:Sankey图的布局算法会自动判断可用空间,只要路径长度和排布空间允许,就会让流向自然衔接闭合
  • 流向的方向与顺序呈镜像对称:当两个系统的流向数据在方向、顺序上完全镜像反转时,哪怕只定义一处连接,剩余的路径也会被算法自动补全,最终形成回路

下面是我基于单一数据集修改第二个系统后做的简易示例,能直观验证这个逻辑:

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

# 初始化画布和Sankey对象
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, xticks=[], yticks=[], title="Sankey Auto-Loop Demo")
sankey = Sankey(ax=ax, unit=None)

# 第一个系统:正向流向
sankey.add(
    flows=[0.25, 0.15, 0.60, -0.25, -0.15, -0.60],
    labels=["In1", "In2", "In3", "Out1", "Out2", "Out3"],
    orientations=[0, 1, 0, 0, 1, 0]  # 控制流向的上下左右方向
)

# 第二个系统:镜像反转的流向,仅指定一处连接
sankey.add(
    flows=[-0.25, -0.15, -0.60, 0.25, 0.15, 0.60],  # 与第一个系统流向完全反转
    labels=["In1", "In2", "In3", "Out1", "Out2", "Out3"],
    orientations=[0, 1, 0, 0, 1, 0],
    prior=0,  # 关联第一个系统
    connect=(3, 0)  # 仅指定第一个系统的第3个出口连接到第二个系统的第0个入口
)

# 完成绘制并展示
diagrams = sankey.finish()
plt.tight_layout()
plt.show()

运行这段代码你会发现:虽然只明确指定了connect=(3, 0)这一处连接,但两个系统之间自动形成了完整的回路。这正是因为两个系统的流向是镜像对称的,且画布空间足够让路径合理排布,Matplotlib的Sankey布局算法自动补全了剩余的连接逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:49:10