如何在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模块来连接流量组,但问题是代码越写越乱,生成的结果也不稳定:
- 有时候效果还不错,但偶尔会出现道路间的流量连接错位的情况,比如某两个方向的流向线条完全偏离了对应道路
- 遇到流量分布不平衡或者交叉口几何布局特殊的情况,生成的图就会变得很丑,甚至出现逻辑错误的线条
所以我想请教大家:
- 有没有桑基图库可以支持自定义节点坐标,并且能控制流的输入/输出方向?用桑基图实现这个需求到底可行吗?
- 如果桑基图这条路走不通,有没有其他更合适的Python工具或者方案推荐?
备注:内容来源于stack exchange,提问作者leonefamily
相关产品推荐
相关产品推荐

