You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Plotly Sankey图表:如何对目标节点进行排序

Plotly Sankey 节点自定义显示顺序解决方案

问题描述

使用Plotly的Sankey类绘制桑基图时,默认会根据链接的value大小对节点排序,导致无法按指定顺序展示节点。例如以下代码中,期望目标节点按T1、T2、T3的顺序排列,但实际因value(1、3、2)的大小,显示顺序变为T2、T3、T1:

import plotly.graph_objects as go

labels = ["Source", "T1", "T2", "T3"]
source = [0, 0, 0]
target = [1, 2, 3]
value = [1, 3, 2]

node = dict(label=labels)
link = dict(source=source, target=target, value=value)

fig = go.Figure(data=[go.Sankey(
    node = node,
    link = link
)])

fig.show()

解决方案:手动指定节点位置

通过给node字典添加x、y坐标参数,并设置arrangement="fixed",可以强制节点按指定顺序排列,不受value影响:

import plotly.graph_objects as go

labels = ["Source", "T1", "T2", "T3"]
source = [0, 0, 0]
target = [1, 2, 3]
value = [1, 3, 2]

node = dict(
    label=labels,
    # x值定义节点所在列:0为左侧列,1为右侧列
    x=[0, 1, 1, 1],
    # y值控制同一列内的垂直位置,数值越小越靠上,按T1→T2→T3顺序分配
    y=[0.5, 0.2, 0.5, 0.8]
)
link = dict(source=source, target=target, value=value)

fig = go.Figure(data=[go.Sankey(
    node=node,
    link=link,
    # 固定布局,禁用自动排序调整
    arrangement="fixed"
)])

fig.show()

关键参数说明

  • x:控制节点所在的水平列,0代表最左侧,1代表最右侧,中间可设置0-1之间的数值划分更多列。
  • y:控制同一列内节点的垂直位置,取值范围0(最顶部)到1(最底部),按需求分配数值即可指定顺序。
  • arrangement="fixed":强制Plotly严格遵循手动设置的坐标,不自动调整节点位置。

批量节点的动态坐标计算

如果需要排列的节点数量较多,可以动态计算y值,确保节点均匀分布:

# 右侧3个节点,动态生成y值
target_count = 3
target_y = [(2*i + 1)/(2*target_count) for i in range(target_count)]
# 完整node配置
node = dict(
    label=labels,
    x=[0] + [1]*target_count,
    y=[0.5] + target_y
)

内容的提问来源于stack exchange,提问作者DerPanda93

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:10:35