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
相关产品推荐
相关产品推荐

