当没有为边定义控制点时,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 不在节点上工作?