Graphviz dot绘制时如何让边仅参与布局路由不参与rank计算
解决方法
你可以通过以下两种方式实现「不影响rank计算、同时保留正常边路由效果」的需求:
方法1:用weight=0属性替代constraint=false
这是最高效的方案:weight=0的边不会参与rank层级的权重计算,不会改变节点原有层级,同时会在路由阶段被dot引擎正常优化,得到和普通边一致的路由效果。
修改后的示例代码如下:
digraph G { subgraph G1 { a1 -> b1 d1 -> b1 b1 -> c1 a1 -> c1 [weight=0] } subgraph G2 { a2 -> b2 d2 -> b2 b2 -> c2 a2 -> c2 } }
修改后G1中a1->c1的路由效果会和G2的a2->c2完全一致,同时不会影响四个节点的原有层级。
方法2:手动固定节点rank后再添加非约束边
如果你的场景必须使用constraint=false,可以先通过rank=same显式固定所有节点的层级,dot引擎在rank分配阶段结束后,会忽略constraint=false的限制,对所有边做正常路由优化:
digraph G { subgraph G1 { # 先固定层级 {rank=same a1 d1} {rank=same c1} a1 -> b1 d1 -> b1 b1 -> c1 a1 -> c1 [constraint=false] } subgraph G2 { a2 -> b2 d2 -> b2 b2 -> c2 a2 -> c2 } }
原问题原因说明
constraint=false会让dot在布局的全流程前期就完全忽略该边,不仅不参与rank计算,后续路由优化阶段也不会将其纳入正常边的路径计算逻辑,所以才会出现路径不合理的问题。
内容的提问来源于stack exchange,提问作者Drew
相关产品推荐
相关产品推荐

