Plotly Sankey:如何避免将所有节点自动放置到右侧?

Ale*_*oca 5 python plotly

桑基斯巧妙地填满了所有可用空间。

如果某些“分支”有 3 个级别(节点 0 -> 节点 1 -> 节点 3),而其他“分支”只有两个级别(节点 0 -> 节点 2),则最终节点(节点 2节点 3)垂直向右对齐。
我希望能够垂直对齐Node 1(不是Node 3!)和Node 2,如附件中的第二个图所示。

对我来说,以编程方式对齐所有节点是相当困难的,所以我想避免这种可能性。

即使在前一种情况下,也会出现问题(Jupyter Lab 的代码):

import plotly.graph_objects as go

sources = [ 0,  0,  1,  1]
targets = [ 1,  2,  3,  4]
values  = [59, 30, 29, 30]

labels = ['Node 0', 'Node 1', 'Node 2', 'Node 3', 'Node 4']

link = dict(source=sources, target=targets, value=values)
node = dict(label=labels)
data = go.Sankey(link=link, node=node)
fig = go.Figure(data)
fig.show(renderer="svg", width=1000, height=500)
Run Code Online (Sandbox Code Playgroud)

产生:

默认错误放置

看起来在放置Node 1时存在一个错误,没有考虑Node0->2流的厚度。

是否可以看出我希望节点 2 位于节点 1 的同一垂直线上,并且节点 2 没有子节点?解决方案是手动放置,可惜我不能这样做,因为我的 Sankey 是高度动态的。

作为解决方法,我在Node 2之后创建了一个虚拟节点,并使其不可见:

import plotly.graph_objects as go

sources = [ 0,  0,  1,  1, 2]
targets = [ 1,  2,  3,  4, 5]
values  = [59, 30, 29, 30, 30]
labels = ['Node 0', 'Node 1', 'Node 2', 'Node 3', 'Node 4']

color_links = ["lightgray", "lightgray", "lightgray", "lightgray", "white"]
color_nodes = ["red", "blue", "green", "navy", "lightgreen", "white"]

link = dict(source=sources, target=targets, value=values, color=color_links)
node = dict(label=labels, color=color_nodes, line = dict(width = 0))
data = go.Sankey(link=link, node=node)
fig = go.Figure(data)
fig.show(renderer="svg", width=1000, height=500)
Run Code Online (Sandbox Code Playgroud)

这会产生:

笨拙的解决方法

我希望有一种更好、更简单的方法来做到这一点。有任何指向工作演示的指针吗?