Graphviz布局时忽略指定边的技术问询
解决Dot图中边不影响布局的问题
我懂你想要的效果——让某条边只负责展示,完全不干扰其他节点和边的布局逻辑对吧?其实Graphviz早就提供了专门的属性来搞定这个:constraint=false。
原理说明
当你给一条边加上constraint=false属性后,Graphviz在计算节点排名、位置这些布局逻辑时,会直接忽略这条边。也就是说这条边只会被渲染出来,但不会对其他边和节点的位置产生任何影响,完美符合你的需求。
结合你的代码修改示例
假设你要添加的是一条不影响布局的虚线边,只需要在定义这条边的时候加上constraint=false即可,完整代码如下:
digraph structs { rankdir=LR edge [tailclip=false]; node [shape=record]; header [label="{<0> |<1> header|<2> }"]; data0 [label="{<0> |<1> data0|<2> }"]; data1 [label="{<0> ...|<1> data1|<2> }"]; // 正常参与布局的实线边 header:1 -> data0:1; // 不影响布局的虚线边,关键是加上constraint=false header:0 -> data1:2 [style=dashed, constraint=false]; }
为什么之前的方法没用?
你之前尝试先处理一部分代码再加虚线边,其实Graphviz在最终渲染时还是会把所有边纳入布局计算。而constraint=false是从布局逻辑层面排除这条边,不管你是一次性定义还是分步骤添加,只要加上这个属性,这条边就不会干扰其他元素的位置了。
额外提示
- 如果有多条边都需要这个效果,给每条边单独加上
constraint=false就行; - 你已经用到的
tailclip=false是用来防止边被节点形状裁剪的,和布局逻辑不冲突,可以保留。
内容的提问来源于stack exchange,提问作者Anton Todorov
相关产品推荐
相关产品推荐

