Graphviz中如何实现严格左右正交弧线绕开节点而非穿过?
问题描述
这是此前Stack Overflow问题的续篇。我需要让图中的连线不仅是严格的东西向,还要是正交(非弯曲)的,因此在dot文件中添加了splines=ortho属性,代码如下:
digraph net { graph [splines=ortho] "C0" [shape=oval label="C0"] "C1" [shape=oval label="C1"] "B0" [shape=box label="B0"] rankdir="LR" "C0":e -> "B0":w "B0":e -> "C1":w "C1":e -> "B0":w }
生成的图像中,连线会穿过节点:
能不能实现让正交连线绕开节点的效果,类似下图?
解决办法
要让正交连线绕开节点,可以试试这几种实用办法:
办法1:调整边的连接端口
指定边从节点的上下端口出发/进入,就能自然绕开其他节点。修改后的dot代码如下:
digraph net { graph [splines=ortho] "C0" [shape=oval label="C0"] "C1" [shape=oval label="C1"] "B0" [shape=box label="B0"] rankdir="LR" "C0":e -> "B0":w "B0":e -> "C1":w # 让C1到B0的边从南侧走,箭头指向B0 "C1":s -> "B0":s [dir=back] }
这里把反向边的端口设为s(南侧),用dir=back保持箭头方向,连线就会向下绕开节点,不会穿过去。
办法2:添加隐形节点引导路径
如果想更灵活控制路径,可以加个看不见的虚拟节点当转折点,逼着连线绕路:
digraph net { graph [splines=ortho] "C0" [shape=oval label="C0"] "C1" [shape=oval label="C1"] "B0" [shape=box label="B0"] # 创建一个隐形节点,用于引导路径转折 dummy [shape=point style=invisible] rankdir="LR" "C0":e -> "B0":w "B0":e -> "C1":w # 通过隐形节点让连线绕路 "C1":e -> dummy:e dummy:w -> "B0":s [dir=back] }
这个隐形节点不会显示在最终图像中,但能引导连线走指定路线,完美避开其他节点。
办法3:拉大节点间距
给节点之间多留点空间,连线自然有地方绕。调整nodesep(节点横向间距)和ranksep(层级纵向间距)参数即可:
digraph net { graph [splines=ortho nodesep=0.8 ranksep=1.2] "C0" [shape=oval label="C0"] "C1" [shape=oval label="C1"] "B0" [shape=box label="B0"] rankdir="LR" "C0":e -> "B0":w "B0":e -> "C1":w "C1":e -> "B0":w }
节点间距变大后,正交连线就有足够空间绕开,不会硬穿节点了。
内容的提问来源于stack exchange,提问作者R71
相关产品推荐
相关产品推荐

