Python Plotly Sankey Diagram:如何根据“源”和“目标”计算“值”,以便所有行与节点的高度相同

问题描述

所以我意识到这是一个非常具体的问题,但它一直困扰着我多年,我似乎找不到解决方案..

我正在使用 Plotly 和 Python 来生成 Sankey 图。我有以下来源、目标和价值数字:

    source  target  value
0      0.0     5.0    1.0
1      0.0     6.0    1.0
2      1.0     6.0    1.0
3      2.0     7.0    1.0
4      3.0     8.0    1.0
5      4.0     8.0    1.0
6      5.0     9.0    1.0
7      6.0    10.0    1.0
8      7.0     9.0    1.0
9      8.0     9.0    1.0
10     9.0    11.0    1.0
11     9.0    12.0    1.0
12     9.0    13.0    1.0
13    10.0    13.0    1.0
14    10.0    14.0    1.0
15    11.0    15.0    1.0
16    12.0    15.0    1.0
17    12.0    16.0    1.0
18    13.0    16.0    1.0
19    14.0    17.0    1.0
20    15.0    18.0    1.0
21    15.0    19.0    1.0
22    16.0    18.0    1.0
23    17.0    19.0    1.0

产生以下 unsmoothed Sankey diagram

但是,你可以看到一些连接线和对应的节点不一样(例如从节点 i 流出的线比节点 i 短)。

令人讨厌的是,Plotly 似乎没有为您提供自动平滑节点线高度差异的选项。您可以使用简单的图表手动完成此操作,但对于像我所附的那样复杂的图表几乎是不可能的 - 更改一个部分的高度意味着您必须更改其他地方的高度等,因为一切都是如此相互关联

您知道我如何根据“源”和“目标”列表计算“价值”数字,以便在所有节点和线条上获得完美平滑吗? (例如像这个smoothed Sankey diagram

我觉得必须有一种算法,无论源列表和目标列表是什么样的,都能给出完美的解决方案,但我想不通..

编辑:

创建图像的代码是:

link = dict(source = source,target = target,value = value_ones)
node = dict(label = label,pad=50,thickness=5)
data = go.Sankey(link = link,node=node)
fig = go.Figure(data)
fig.show()

label 只是一个包含唯一源值和升序数字 0-19 的字典

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)