使用matplotlib在sankey图中连接两个以上的系统使我错位

时间:2018-08-02 10:00:51

标签: python matplotlib sankey-diagram

我正在尝试使用matplotlib制作一个稍微复杂的sankey图,这应该是动态的,因为我应该能够更改流的值并且所有连接都应保持连接状态。这意味着我无法像this示例中所建议的那样手动调整路径长度。为了使自己熟悉显式和隐式连接,我尝试从this的两个系统的示例继续构建,其中两个系统仅通过一个显式连接连接在一起。通过此示例,您可以更改流的值,并且事物保持正确连接。因此,我尝试添加从系统1到2的第四个系统,但似乎无法使隐式连接正常工作。请参见下面的代码和输出。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.sankey import Sankey
import matplotlib as mpl


fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, xticks=[], yticks=[], title="Two Systems")
flows = [0.3, 0.1, 0.40, -0.20, -0.4, -0.2]
sankey = Sankey(ax=ax, unit=None, radius=0.15, )


sankey.add(flows=flows, label='one',
           orientations=[-1, 1, 0, 1, 0, -1])
sankey.add(flows=[-0.3, 0.2, 0.1], label='two',
           orientations=[-1, -1, 0], prior=0, connect=(0, 0))
sankey.add(flows=[-0.1,-0.1,0.2], label='three',
           orientations=[1,0,1], prior=0,connect=(1, 0))
sankey.add(flows=[0.4,-0.1,-0.3], label='four',
           orientations=[-1,-1,0], prior=0,connect=(4, 0))
diagrams = sankey.finish()
diagrams[-1].patch.set_hatch('/')
plt.legend(loc='best')


plt.show()
print "Test"

Misaligned system in sankey diagram

通过多个连接的系统制作动态sankey图的任何提示或技巧将不胜感激。

1 个答案:

答案 0 :(得分:1)

我的想法是,在完成该图之前,您不知道各个笔尖的位置,因此,您需要完成一次该图,然后获取补丁2(橙色)上流程2的笔尖位置。并在补丁4(红色)上流1。尖端位置的差异(x_adj,y_adj)是需要对补丁4的主干长度(以校正垂直方向)和补丁2上的流2的路径长度进行调整。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.sankey import Sankey
import matplotlib as mpl


x_adj,y_adj = 0,0
for _ in range(2):
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1, xticks=[], yticks=[], title="Two Systems")
    sankey = Sankey(ax=ax, unit=None, radius=0.15, )
    sankey.add(flows=[0.3, 0.1, 0.40, -0.20, -0.4, -0.2],
               label='one',
               orientations=[-1, 1, 0, 1, 0, -1])
    sankey.add(flows=[-0.3, 0.2, 0.1], label='two',
               pathlengths = [0.5,0.5,0.5- x_adj],
               orientations=[-1, -1, 0], prior=0, connect=(0, 0))
    sankey.add(flows=[-0.1,-0.1,0.2], label='three',
               orientations=[1,0,1], prior=0,connect=(1, 0))
    sankey.add(flows=[0.4,-0.1,-0.3], label='four', trunklength=1. - y_adj,
               orientations=[-1,-1,0], prior=0,connect=(4, 0))
    diagrams = sankey.finish()
    print(x_adj,y_adj)
    x_adj,y_adj = diagrams[1].tips[2] - diagrams[3].tips[1]
diagrams[-1].patch.set_hatch('/')
plt.legend(loc='best')
plt.show()