基于nx.DiGraph绘桑基图:理解matplotlib中prior与connect参数
从有向图视角理解Matplotlib桑基图的
prior与connect参数 先明确核心逻辑:Matplotlib的桑基图是按层级组织流的传递,而你的nx.DiGraph里的节点对应桑基图的层级节点,边对应流的连接。prior和connect是分工明确的两个参数,并非重复指定,而是分别处理「层级关联」和「具体流映射」。
1. prior:指定当前层级的上游层级索引
桑基图的节点是按“层”排列的,比如输入层、中间层、输出层,每个层对应一组节点。prior的作用是告诉Matplotlib:当前要绘制的这一层节点,它的上游是哪一层。
举个有向图的例子:假设你的nx.DiGraph有节点S→A→T、S→B→T,拆分桑基图层级为:
- 层级0:
[S](起点层) - 层级1:
[A, B](中间层) - 层级2:
[T](终点层)
绘制层级1时,prior=0——表示这一层的上游是层级0;绘制层级2时,prior=1——表示上游是层级1。这一步是先搭好桑基图的“层级骨架”,明确层与层之间的上下游关系。
2. connect:指定上游流与当前流的对应关系
connect是元组列表,每个元组(上游流索引, 当前流索引),这里的“索引”是指当前层级内节点的顺序位置。它的作用是精准指定:上游层级的第N个节点(流),要连接到当前层级的第M个节点(流)。
还是上面的例子:
- 绘制层级1时,
connect=[(0, 0), (0, 1)]——层级0的第0个节点(S),分别连到层级1的第0个(A)和第1个(B)节点,对应有向图里的两条边S→A、S→B。 - 绘制层级2时,
connect=[(0, 0), (1, 0)]——层级1的第0个节点(A)连到层级2的第0个(T),层级1的第1个节点(B)也连到层级2的第0个(T),对应有向图里的A→T、B→T。
为什么需要两个参数?
两者完全是不同维度的配置:
prior解决的是**“哪一层和哪一层关联”**的问题,是层级之间的宏观关系,相当于给桑基图划分“模块”。connect解决的是**“模块内的哪个节点连到另一个模块的哪个节点”**的问题,是节点之间的微观映射,相当于给模块间搭具体的“连接线”。
结合Rankine循环示例理解
Rankine循环是闭环结构:锅炉→汽轮机→冷凝器→水泵→锅炉,对应的桑基图层级可以拆分为:
- 层级0:
[锅炉] - 层级1:
[汽轮机] - 层级2:
[冷凝器] - 层级3:
[水泵]
当绘制循环的最后一段(水泵→锅炉)时,需要回到层级0,此时:
prior=3——指定当前层级(层级0)的上游是层级3(水泵所在层)connect=[(0, 0)]——层级3的第0个节点(水泵输出)连到层级0的第0个节点(锅炉输入)
这就通过prior指定了跨层级的上游关联,用connect指定了具体的流闭环,完美对应有向图里的循环边。
内容的提问来源于stack exchange,提问作者Galen
相关产品推荐
相关产品推荐

