首页 > 解决方案 > Graphviz 边缘标签位置 - 当没有为边缘定义控制点时,graphviz 忽略标签位置

问题描述

当没有为边定义控制点时,Graphviz(使用neato)会忽略标签位置。

我可以蛮力定位标签,但我这样做是在不知道真正的问题的情况下。

有没有办法停止 graphviz 在没有预定义曲线控制点的边缘中覆盖 lp、xlp?

为什么 lp 不在节点上工作?

仅当我定位节点和边缘并定义边缘曲线时,我才能定位边缘标签

# manual_edge.dot
digraph G {

  A [label = "A"  xlabel="a" pos="0,100" lp="200,100!" xlp="300,100!" ]
  B [label = "B"  xlabel="b" pos="100,0" lp="200,0!" xlp="300,0!" ]

  A -> B  
    [pos="0,100 0,0 0,0 100,0" ] 
    [label = "A->B"  xlabel="a->b" lp="200,50!" xlp="300,50!" ]   
}

定义边缘曲线时的标签定位

定义位置很容易,定义曲线有点痛苦。如果我不这样做 - 边缘标签位置不起作用:

# edge.dot
digraph G {

  A [label = "A"  xlabel="a" pos="0,100" lp="200,100!" xlp="300,100!" ]
  B [label = "B"  xlabel="b" pos="100,0" lp="200,0!" xlp="300,0!" ]

  A -> B  
    [label = "A->B"  xlabel="a->b" lp="200,50!" xlp="300,50!" ]   
}

未定义边缘曲线时标签定位不起作用

当我导出输出时,我可以看到当我没有定义边缘曲线时,我的标签位置被覆盖了

$ dot -Tdot -Kneato -n2 -o ./output.dot ./edge.dot
    A -> B   [label="A->B",
        lp="30.532,60.968",
        pos="e,84.997,15.003 15.188,84.812 31.877,68.123 58.839,41.161 77.877,22.123",
        xlabel="a->b",
        xlp="33.032,45.968"];

为了解决这种行为,我将我的值放在无意义的属性中,这些属性可以在处理过程中存活并使用正则表达式来清理文件,然后再将其传递回neato:

...
[label = "A->B"  xlabel="a->b" zzzzl="200,50!" zzzzxl="300,50!" ]   
...
...
    A -> B   [label="A->B",
        lp="30.532,60.968",
        pos="e,84.997,15.003 15.188,84.812 31.877,68.123 58.839,41.161 77.877,22.123",
        xlabel="a->b",
        xlp="33.032,45.968",
        zzzzl="200,50!",
        zzzzxl="300,50!"];
...

将 zzzzl 转换为 lp 后,将 zzzzzxl 转换为 xlp 图表即可工作。这是因为当属性被多次设置时,最后一个值被使用


dot -Tpng -Kneato -n2 -O ./output.dot

这让我得到了我想要的,但它有点啰嗦。有没有办法阻止graphviz在边缘覆盖lp,xlp?为什么 lp 不在节点上工作?

标签: graphvizneato

解决方案


推荐阅读