在matplotlib桑基图中连接流向
我正在使用 matplotlib 的 sankey
功能,但在连接两个流的时候遇到了问题。简单来说,我想把流 Qab,rekup
连接到流 Qzu,rekup
的末尾(见截图)。
这看起来应该很简单,但我还是没弄明白该怎么做。
这是截图: https://www.dropbox.com/s/2satz9ryniy958v/Sankey.png?dl=0

这是代码:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.sankey import Sankey
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, xticks=[], yticks=[],
title="Vereinfachtes Kraftwerksmodell")
sankey = Sankey(ax=ax, unit=None)
sankey.add(flows=[1.0, -0.3, -0.1, -0.1, -0.5],
labels=['P$el$', 'Q$ab,vd$', 'P$vl,vd$', 'P$vl,mot$', ''],
label='Laden',
orientations=[0, -1, 1, 1, 0])
sankey.add(flows=[0.5, 0.1, 0.1, -0.1, -0.1, -0.1, -0.1, -0.3], fc='#37c959',
label='Entladen',
labels=['P$mech$', 'Q$zu,ex$', 'Q$zu,rekup$', 'P$vl,tb$', 'P$vl,gen$', 'Q$ab,tb$', 'Q$ab,rekup$', 'P$nutz$'],
orientations=[0, -1, -1, 1, 1, -1, -1, 0], prior=0, connect=(4, 0))
sankey.add(flows=[-0.1, 0.1],
label='Rekuperator',
#labels=['bla'],
orientations=[1,1], prior=1, connect=(2, 0))
diagrams = sankey.finish()
diagrams[-1].patch.set_hatch('/')
plt.legend(loc='lower right')
plt.show()
有没有人知道该怎么做?
提前谢谢你们!
Cord
2 个回答
6
我也来得很晚,不过其实有个更简单的方法,不用担心路径长度的问题。
当你反向运行一个路径时,方向的值会被反转,所以-1表示向上,1表示向下。
要修正你的代码,你只需要把Rekuperator的sankey代码改成:
sankey.add(flows=[-0.1, 0.1],
label='Rekuperator',
#labels=['bla'],
orientations=[-1,-1], prior=1, connect=(2, 0))
这样就能生成这个图:

4
我觉得我来得有点晚,不过这里有个解决办法:你需要为第一个节点指定路径长度,然后手动调整它,使其与较小的那个匹配。
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, xticks=[], yticks=[],
title="Vereinfachtes Kraftwerksmodell")
sankey = Sankey(ax=ax, unit=None)
sankey.add(flows=[1.0, -0.3, -0.1, -0.1, -0.5],
pathlengths = [0.5,0.06,0.5,0.5,0.375],
labels=['P$el$', 'Q$ab,vd$', 'P$vl,vd$', 'P$vl,mot$', ''],
label='Laden',
orientations=[0, -1, 1, 1, 0])
sankey.add(flows=[0.5, 0.1, 0.1, -0.1, -0.1, -0.1, -0.1, -0.3], fc='#37c959',
label='Entladen',
labels=['P$mech$', 'Q$zu,ex$', 'Q$zu,rekup$', 'P$vl,tb$', 'P$vl,gen$', 'Q$ab,tb$', 'Q$ab,rekup$', 'P$nutz$'],
orientations=[0, -1, -1, 1, 1, -1, -1, 0], prior=0, connect=(4, 0))
sankey.add(flows=[-0.1, 0.1],
label='Rekuperator',
#labels=['bla'],
orientations=[1,1], prior=1, connect=(2, 0))
diagrams = sankey.finish()
diagrams[-1].patch.set_hatch('/')
plt.legend(loc='lower right')
plt.show()