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

Plotly Sankey图节点按列排列:无需手动设置坐标的实现方案?

Plotly Sankey图多列节点固定排列解决方案

问题场景

制作包含4类节点的Plotly Sankey图,要求节点按组别从左到右分四列垂直排列(第1组左对齐,第2组在其右侧,依次类推)。但数据存在短链路(仅2或3个节点),默认布局会把无后续链接的第三列节点挪到最右侧第四列。手动设置x、y坐标能解决,但数据动态变化时过于繁琐;单独设置x坐标无效,也搞不清domain_column参数的用法。

解决方案

核心是给每个节点标记所属列,自动生成对应x坐标,让Plotly自动处理y坐标,不用手动计算垂直位置:

  • 给每个节点绑定对应的列索引(比如第1组节点列索引为0,第2组为1,以此类推)
  • 为每列分配固定x坐标,根据节点的列索引批量生成x值
  • 只设置node的x参数,y参数留空,让Plotly自动排列垂直位置

代码示例

import plotly.graph_objects as go

# 节点标签与对应列索引(0=第一列,1=第二列,2=第三列,3=第四列)
labels = ["1a","1b", "2a", "2b", "3a", "3b", "4b"]
node_column_indices = [0, 0, 1, 1, 2, 2, 3]

# 预定义每列的x坐标,保证列间距均匀
column_x_positions = [0.05, 0.35, 0.65, 0.95]
# 批量生成每个节点的x坐标
node_x = [column_x_positions[col] for col in node_column_indices]

fig = go.Figure(go.Sankey(
    node = {
        "label": labels,
        "x": node_x,  # 使用自动生成的x坐标
        # 不手动设置y,Plotly会自动分配垂直位置
        "pad": 500,
        "thickness": 70,
        "color": "red"
    },
    link = {
        "source": [0, 1, 2, 3, 5, 3],
        "target": [3, 2, 4, 5, 6, 4],
        "value": [1, 1, 1, 1, 1, 1]
    }
))

fig.show()

关于domain_column参数的说明

这个参数和节点列排列无关,它是用来控制整个Sankey图在画布中的横向占比。比如当你在同一个图中放置多个Sankey图时,domain_column可以将画布划分为多列,指定当前Sankey图占用哪一列。对单图的节点分组排列需求没有帮助,所以之前的尝试没有效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:10:22