Plotly Sankey图中自定义x、y坐标未按预期生效的问题咨询
嗨,我完全懂你现在的困惑——明明手动给Sankey节点设置了x、y坐标,结果节点的排列顺序却和预期的不一样,确实挺闹心的。
咱们先拆解下问题:你设置了左侧三个节点(A、B、C)的x值都是0.01,y值分别是0.01、0.40、0.5,预期它们从上到下是A→B→C的顺序,但实际生成的图里却变成了A→C→B,这主要是因为你用了arrangement='snap'这个参数。
问题根源
Plotly的arrangement='snap'是用来自动优化Sankey布局的,它会尝试调整节点的位置,避免节点之间重叠或者链接交叉,哪怕你手动设置了x和y坐标,这个参数也会优先进行自动调整,直接覆盖了你的自定义设置,这就是为什么节点顺序乱掉的原因。
解决方案
要让Plotly严格遵循你设置的x、y坐标,只需要把arrangement参数改成'fixed'就可以了。另外还要注意一个细节:Plotly Sankey图的y轴默认是底部为0,顶部为1,所以你设置的y=0.01会对应最下方的位置,y=0.5对应中间偏上的位置。如果想让A在最上方,你可能需要把A的y值改成0.99,B改成0.6,C改成0.1这类,或者调整你的y值计算逻辑。
修改后的代码如下:
import plotly.graph_objects as go fig = go.Figure(go.Sankey( arrangement='fixed', # 关键修改:从snap改成fixed node=dict( label=['A', 'B', 'C', 'D', 'E', 'F'], x=[0.01, 0.01, 0.01, 0.5, 0.99, 0.99], y=[0.01, 0.40, 0.5, 0.1, 0.01, 0.3], pad=10, ), link=dict( source=[0, 1, 2, 3, 3], target=[3, 3, 3, 4, 5], value=[40, 10, 50, 30, 70] ) )) fig.show()
修改后运行代码,左侧的节点就会严格按照你设置的y值排列了。如果你想让A在最上方,只需要把A的y值调整为0.99,B改成0.6,C改成0.1,这样就能得到你预期的从上到下A→B→C的顺序啦。
你预期的效果是左侧x=0.01位置的节点从上到下依次为A、B、C,三个节点都连接到中间的D节点;而之前用
snap参数时,实际生成的图中左侧节点顺序变成了A、C、B,和预期不符。
备注:内容来源于stack exchange,提问作者x0nar

