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

如何在Plotly中预定位Sankey图节点并解决重叠与排序问题?

解决Plotly Sankey图节点重叠、链接排序及固定X轴位置问题

一、修正节点重叠问题

  • 手动指定节点坐标:在Sankey的node参数中,通过x数组给不同年度的In/Out节点设置差异化横向位置,比如2020 In设为0.1、2020 Out设为0.2,2021 In设为0.3、2021 Out设为0.4,拉开横向间距;y坐标按同X位置的节点数量均分,比如3个同X节点的y设为0.25, 0.5, 0.75,避免纵向挤压。
  • 调整节点内边距:增大node.pad参数值(比如从默认15改为25),增加节点间的空白区域,减少重叠概率。

二、统一链接排序

  • 控制link数组顺序:Plotly按link数组的渲染顺序展示链接,将同一起点的链接按流量大小或目标节点索引排序后再传入,就能保证排序一致。比如优先排列流量大的链接,或按目标节点的编号从小到大排列。
  • 利用node.order参数:给每个节点设置order数组,指定该节点输出链接的目标节点顺序,强制链接按规则排列。

三、固定节点X轴位置

Plotly支持直接固定节点X轴位置,只需在node.x数组中给每个节点赋值(取值范围0-1,0对应最左侧,1对应最右侧)。示例代码:

import plotly.graph_objects as go

fig = go.Figure(data=[go.Sankey(
    node = dict(
        x = [0.1, 0.2, 0.3, 0.4],  # 固定每个节点的X位置
        y = [0.5, 0.5, 0.5, 0.5],
        label = ["2020 In", "2020 Out", "2021 In", "2021 Out"]
    ),
    link = dict(
        source = [0, 1, 2],
        target = [1, 2, 3],
        value = [10, 8, 12]
    )
)])
fig.show()

设置后节点横向位置不会自动调整,完全符合自定义布局需求。

四、参考D3实现目标布局

如果要对齐D3的Sankey布局效果,可采用两种方式:

  • 复用D3计算结果:先用D3的sankey()布局算出所有节点的x/y坐标及链接路径,再将这些数据直接传入Plotly的Sankey参数中,完全沿用D3的布局逻辑。
  • 自定义布局计算:参考D3的Sankey算法逻辑,自行编写代码计算节点位置和链接排序,再手动配置Plotly的node和link参数,实现一致的布局效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:10:39