You need to enable JavaScript to run this app. 使用Plotly绘制Sankey桑基图时节点标签位置错位问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

使用Plotly绘制Sankey桑基图时节点标签位置错位问题咨询

Plotly桑基图流向标签位置错位的核心原因

根本触发点:节点索引越界,触发隐式节点自动补全逻辑

现有配置中,node.label仅定义了2个有效节点,可被引用的合法索引范围仅为0、1:

  • 索引0:对应标签F1
  • 索引1:对应标签F2

但link配置中的source数组设置为[1,2],其中索引2的节点从未被显式声明。Plotly检测到未定义的节点引用时,会自动创建一个无标签的默认隐式节点,不会按照用户预期将其与其他同属性节点放在同一侧。
此时实际生效的节点集包含3个对象,自动排布逻辑会根据每个节点的流入、流出属性调整位置:

  • 作为所有链路唯一目标的0号节点(F1)会被默认排布在最左侧
  • 带有流出流量的1号、2号节点本应被自动排布在右侧区域,但由于节点总数量少、无固定位置约束,2号隐式节点会被算法随机放置在左侧可视区,和0号节点处于同一列

最终两条链路的走向完全相反:一条从右侧的1号节点流向左侧的0号节点,另一条从左侧的2号隐式节点流向右侧相邻的0号节点。链路标签默认渲染在链路的几何中点位置,自然就出现了一个标签在左、一个在右的视觉错位。

内置排布规则说明

当arrangement="snap"时,节点位置完全由算法根据流量关系自动计算,不存在强制位置约束:

  • 所有带有流出流量的节点,默认会向可视区右侧排布
  • 所有带有流入流量的节点,默认会向可视区左侧排布
  • 链路标签固定渲染在链路的几何中点,不会主动向某一侧节点固定靠拢。

修复方案

  • 补全所有被引用的节点定义,避免出现索引越界
  • 将自动排布模式从snap改为fixed,手动指定每个节点的相对x、y位置,强制把所有作为来源的节点放在图面右侧、作为目标的节点放在图面左侧,保证所有链路流向统一。

修正后的核心配置参考:

import plotly.graph_objects as go

fig = go.Figure(go.Sankey(
    arrangement = "fixed",
    node = {
        "label": ['F1', 'F2', 'F3'], 
        'pad':10,
        # x值范围为0~1,0代表图面最左,1代表图面最右
        "x": [0.01, 0.99, 0.99],
        "y": [0.5, 0.2, 0.8]
    },  
    link = {
        "source": [1,2], 
        "target": [0,0], 
        "value": [1,1]
    }))
fig.show()
fig.write_image('output.png')

调整后所有链路统一从右侧流向左侧的F1节点,链路的几何中点自然落在靠近左侧F1的位置,标签就会按照预期统一显示在左侧节点周边。


内容的提问来源于stack exchange,提问作者Stücke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 18:15:10