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

如何移动Graphviz节点至左侧?Streamlit梯度下降可视化布局调整

解决方案:利用Graphviz的Rank属性控制节点层级

要实现黑色箭头(正向计算)全向右、红色箭头(反向梯度)全向左的效果,核心是通过rank属性强制节点处于正确的水平层级——手动指定pos通常会被Graphviz的dot布局引擎忽略,优先遵循自动布局规则,所以用rank控制层级更可靠。

具体操作:

  • 强制输入节点3、4、5处于同一最左侧层级(rank='same')
  • 按正向计算顺序依次设置后续节点的层级:12 → 12 → 60 → 1600(从左到右排列)
  • 保持原有边的方向:正向边(黑色)从左到右,反向边(红色)从右到左,箭头方向自然符合预期

修改后的代码:

import graphviz
import streamlit as st

graph = graphviz.Digraph(graph_attr={'rankdir':'LR'})

# 强制输入节点在同一左侧层级
with graph.subgraph() as s:
    s.attr(rank='same')
    s.node('3')
    s.node('4')
    s.node('5')

# 正向计算(黑色箭头,从左到右)
graph.edge('3', '12 ', label='3*4')
graph.edge('4', '12 ', label='4*3')
graph.edge('12 ', '12', label='max(0,12)')
graph.edge('12', '60', label='12*5')
graph.edge('5', '60', label='5*12')
graph.edge('60', '1600', label='(100 - 60)**2')

# 反向梯度(红色箭头,从右到左)
graph.edge('1600', '60', label='2*(100 - 60)=80', color='red')
graph.edge('60', '12', label='5*80=400', color='red')
graph.edge('60', '5', label='12*80=960', color='red')
graph.edge('12', '12 ', label='1*400=400', color='red')
graph.edge('12 ', '3', label='400*4=1600', color='red')
graph.edge('12 ', '4', label='400*3=1200', color='red')

st.graphviz_chart(graph)

关键说明

  1. rank属性的作用:rank='same'子图会强制内部节点处于同一水平线上,确保5和3、4一起在最左侧,这样60→5的红色箭头自然向左。
  2. 节点名称注意:代码中12 带空格,要确保所有引用一致,避免出现重复节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:55:40