如何控制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
相关产品推荐
相关产品推荐

