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

如何优化算法交易系统中混乱的Plotly Sankey图布局?

优化Plotly Sankey图布局:算法交易流程可视化解决方案

一、强制符合逻辑流向的布局调整方法

  • 手动绑定节点坐标:Plotly Sankey支持通过node.x和node.y参数直接定义每个节点的位置。按你的需求,把所有开仓节点的x值设为0(左侧),目标位节点x设为0.5(中间),平仓节点x设为1(右侧),从根源上固定流向。纵向坐标可按节点分组均匀分配,避免重叠挤压。
  • 清理异常链接数据:先排查link输入中的反向连接(如平仓指向开仓),如果是数据错误直接修正;如果是合法的策略循环逻辑,可将这类节点的x值设为同一区间,避免跨流向干扰整体布局。

二、输入列表顺序对节点位置的影响

Plotly Sankey的节点索引完全对应node.label的输入顺序,自动布局时会根据链接关系调整,但手动指定坐标时,输入顺序就是你控制节点位置的核心依据。建议先将节点按「开仓→目标位→平仓」分组排序,再对应设置x坐标,这样更易管理大规模节点:

# 按流程分组整理节点标签
open_nodes = ["开仓策略A", "开仓策略B", ...]
target_nodes = ["目标位1", "目标位2", ...]
close_nodes = ["止盈平仓", "止损平仓", ...]
all_nodes = open_nodes + target_nodes + close_nodes

# 固定横向坐标,纵向按分组内顺序均匀分配
node_x = [0]*len(open_nodes) + [0.5]*len(target_nodes) + [1]*len(close_nodes)
node_y = [i/(len(open_nodes)-1) for i in range(len(open_nodes))] + \
         [i/(len(target_nodes)-1) for i in range(len(target_nodes))] + \
         [i/(len(close_nodes)-1) for i in range(len(close_nodes))]

# 构建Sankey图
fig = go.Figure(data=[go.Sankey(
    node = dict(
        pad = 15,
        thickness = 20,
        line = dict(color = "black", width = 0.5),
        label = all_nodes,
        x = node_x,
        y = node_y
    ),
    link = dict(
        source = [0, 0, 12, ...],  # 对应all_nodes的索引
        target = [12, 13, 25, ...],
        value = [5, 3, 8, ...]
    )
)])

三、更适合大规模节点的Sankey替代方案

  • PyVis:针对大规模节点的交互式可视化工具,支持自定义力导向布局,可手动拖拽调整节点位置后导出布局,还能通过颜色、大小区分策略组,适合189个节点的复杂场景。
  • NetworkX + Graphviz:用NetworkX构建有向图,调用Graphviz的dot布局算法实现严格的分层流向(从左到右),对交易流程这类线性+分支的结构适配性极强,布局逻辑清晰无反向路径。
  • Plotly参数优化:若坚持用Plotly,可尝试设置arrangement='perpendicular'减少交叉链接,调整node.pad增大节点间距,同时用link.color按策略类型(如ratchet bracket、grab cents)区分链接,提升可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:37:22