如何设置Plotly Sankey Diagram(桑基图)的固定节点顺序
Plotly桑基图批量生成固定节点顺序修正方案
问题说明
- 循环批量生成多组桑基图时,受Plotly内置自动布局优化机制影响,各图表节点排布位置不统一
- 要求固定节点标准展示顺序为:
[Formal, Informal, Unemployed, Inactive] - 修正过程需保持原有Python代码的语法、变量/函数名、技术标识符完全不变
- 效果参考:
- 预期正确效果:节点从上到下严格按指定顺序排列,批量生成的所有图表同节点位置完全一致
- 当前错误效果:节点位置随单组数据流量变化自动调整,不同图表同节点位置偏移,顺序不符合预设要求
修正原理
Plotly桑基图默认会根据链路流量权重自动调整节点垂直位置,要强制固定顺序,需要显式指定每个节点的归一化垂直坐标,同时关闭自动排布逻辑,所有原有业务代码、变量逻辑不需要改动,仅新增节点位置配置即可。
具体修正代码
在原有构造桑基图节点配置的位置,新增坐标映射逻辑,其他原有代码完全保留:
# ---------- 以下为新增固定顺序配置,原有代码不需要修改 ---------- # 定义固定节点顺序 fixed_order = ["Formal", "Informal", "Unemployed", "Inactive"] # 为每个节点分配归一化y坐标(0为画布底部,1为画布顶部,预留边距避免节点溢出) y_position_map = {node_name: 0.9 - idx * 0.26 for idx, node_name in enumerate(fixed_order)} # 按原有node_labels的顺序生成匹配的y坐标列表 fixed_node_y = [y_position_map[label] for label in node_labels] # ---------- 新增配置结束 ---------- # 原有node配置字典,仅新增y参数,其他原有参数完全不动 node = dict( pad=15, thickness=20, line=dict(color="black", width=0.5), label=node_labels, y=fixed_node_y # 新增:传入固定y坐标 ) # 原有初始化Sankey的代码,仅新增arrangement参数,其他原有配置完全不动 fig = go.Figure(go.Sankey( arrangement="fixed", # 新增:关闭自动布局调整,强制使用指定坐标 node=node, link=link # 原有link配置,完全不动 ))
补充说明
如果桑基图是多列节点结构(比如左侧为源节点、右侧为目标节点),只需要给同名列的节点匹配上述y坐标即可,可额外给左侧节点统一设置x=0.1、右侧节点统一设置x=0.9,不会影响垂直顺序的固定效果,批量生成时所有图表的节点位置会完全统一。
内容的提问来源于stack exchange,提问作者A6UD3L01196
相关产品推荐
相关产品推荐

