如何防止graphviz中的边标签破坏布局?

4

我有一个简单的垂直图表,看起来漂亮而对称,没有任何标签,使用以下代码:

digraph test_alignment
{
    {rank=same; a -> b;}
    a -> c;
    b -> c;
    c -> d;
    d -> e;
    d -> f;
    {rank=same; e -> f;}
}

初始图形

我想给A和B之间的边以及E和F之间的边贴上标签,并使用相同的字符串来标记。我期望得到相同的输出,只是A->B和E->F边更长,带有相同的标签。

不幸的是,一旦我给这些边之一添加标签,整体布局看起来略微歪斜(如果我给E->F边添加标签,结果会类似):

digraph test_alignment
{
    {rank=same; a -> b [label="Label"];}
    a -> c;
    b -> c;
    c -> d;
    d -> e;
    d -> f;
    {rank=same; e -> f;}
}

只有一个标签的相同图形

我对graphviz非常陌生,在Stack Overflow上看了很多问题之后,我尝试使用不同的rank和constraint组合。我尝试使用群集来查看它是否可以将顶部和底部正确地独立对齐,并尝试使用dot、ccomp、gvpack和neato的混合产生了类似的结果。

总是似乎由于在具有相同rank的节点之间的边缘添加标签会以我目前还不理解的方式影响这些节点的位置。

我错过了一些微不足道的东西吗?还是我在尝试一些无用之举而不是让dot自己处理?

我使用的是dot - graphviz版本2.36.0(20140111.2315),链接图片仅使用dot生成(虽然使用:时我获得了类似的结果)。

dot test_alignment.dot -Tpng -O
1个回答

5
您可以尝试使用 xlabel 属性,如果必要的话,可以与 forcelabels 一起使用。从描述中可以看出:对于边缘,标签将位于边缘的中心附近。这在dot中非常有用,可以避免使用边缘标签时导致布局失真的问题。

1
哎呀,我竟然错过了xlabel属性,非常感谢你。我使用xlabel、minlen和(诚实地说有点丑陋的)HTML标签的混合方式,成功地实现了我想要的结果。谢谢! - Kefen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接