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

如何在Python中实现支持自定义节点坐标与流向的道路交叉口流量桑基图?

如何在Python中实现支持自定义节点坐标与流向的道路交叉口流量桑基图?

我最近在尝试用Python做道路交叉口的流量桑基图,但遇到了个头疼的问题:找了好几个桑基图专用模块,居然都不支持自定义节点坐标和控制输入/输出流的旋转方向。

比如我用sugikey库试着做了一版,代码如下:

import networkx as nx
import matplotlib.pyplot as plt
import sugikey

coords = {
    'West': {
        'out': (0, 95),
        'in': (0, 105)
    },
    'South': {
        'out': (105, 0),
        'in': (95, 0)
    },
    'East': {
        'out': (200, 105),
        'in': (200, 95)
    },
    'North': {
        'out': (95, 200),
        'in': (105, 200)
    }
}

flows = {
    'West': {
        'South': 5,
        'East': 15,
        'North': 3
    },
    'South': {
        'West': 5,
        'East': 2,
        'North': 13
    },
    'East': {
        'South': 3,
        'West': 17,
        'North': 7
    },
    'North': {
        'South': 11,
        'East': 2,
        'West': 1
    }
}

dig = nx.DiGraph()
for out_node, dest_flows in flows.items():
    onode = coords[out_node]['out']
    for in_node, flow in dest_flows.items():
        inode = coords[in_node]['in']
        if onode not in dig.nodes:
            dig.add_node(onode, name=out_node)
        if inode not in dig.nodes:
            dig.add_node(inode, name=in_node)
        dig.add_edge(onode, inode, value=flow)

fig, ax = plt.subplots()
sugikey.sankey.sankey_from_dig(dig, ax=ax)
fig.savefig("test.png")

用这段代码生成的图,节点虽然按我设定的坐标摆好了,但流量线条的走向很杂乱,完全没有交通交叉口该有的规整感——我想要的是那种标准的交通流量桑基图:四个方向的节点分别对应交叉口的四条道路,每个方向的出流会按转向(比如西向南转、西向东直行、西向北转)整齐排列,流量线条沿着符合直觉的路径连接到对应方向的入流节点。

现在我自己写了个替代方案,没有用桑基图库,而是纯靠三角函数计算加上bezier模块来连接流量组,但问题是代码越写越乱,生成的结果也不稳定:

  • 有时候效果还不错,但偶尔会出现道路间的流量连接错位的情况,比如某两个方向的流向线条完全偏离了对应道路
  • 遇到流量分布不平衡或者交叉口几何布局特殊的情况,生成的图就会变得很丑,甚至出现逻辑错误的线条

所以我想请教大家:

  1. 有没有桑基图库可以支持自定义节点坐标,并且能控制流的输入/输出方向?用桑基图实现这个需求到底可行吗?
  2. 如果桑基图这条路走不通,有没有其他更合适的Python工具或者方案推荐?

备注:内容来源于stack exchange,提问作者leonefamily

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:49:33