微调dot中的边缘和标签位置

4
我正在使用dot绘制图表。为了使其易于阅读,我需要微调边缘标签的位置,并且(如果可能)使某些边缘是直线而其他边缘是曲线。我希望能获得关于如何在dot中完成这些事情的一般建议,但基于具体性,我在下面列出了我的具体问题。
以下是代码,后面跟着当前的外观:
digraph myGraph {
    rankdir=BT;
    splines=line;

    "AB.BC" -> "AB.AC.BC" [weight=4]
    "AB.BC" -> "ABC" [color=red,style=dashed,label="I(A;C|B)"]
    "A.B.C" -> "A.BC" [color=red, label="I(B;C)"]
    "A.B.C" -> "AC.B" [color=red, label="I(A;C)"]
    "A.B.C" -> "AB.C" [color=red, label="I(A;B)"]
    "A.BC" -> "AB.BC" [color=red, label="I(A;B)"]
    "A.BC" -> "AC.BC" [color=red, label="I(A;C)"]
    "AB.AC.BC" -> "ABC" [weight=4]
    "AC.B" -> "AC.BC" [color=red, label="I(B;C)"]
    "AC.B" -> "AB.AC" [color=red, label="I(A;B)"]
    "AC.BC" -> "AB.AC.BC" [weight=4]
    "AC.BC" -> "ABC" [color=red,style=dashed, label="I(A;B|C)"]
    "AB.AC" -> "AB.AC.BC" [weight=4]
    "AB.AC" -> "ABC" [color=red,style=dashed, label="I(B;C|A)"]
    "AB.C" -> "AB.BC" [color=red, label="I(A;B)"]
    "AB.C" -> "AB.AC" [color=red, label="I(A;C)"]

}

在这里输入图片描述

这个图离我想要的很接近,但有几个问题:

  • 标签的位置使人难以清楚地看到哪个标签与哪个边相关
  • 由于某种原因,一些边在标签处弯曲。(在添加标签之前,它们是直线。)

我尝试过调整rowsepnodesep属性,但没有改善。如果我删除splines=line行,它会变得可读,但并不是我想要的:

在这里输入图片描述

虚线边缘弯曲是可以的——实际上很好,因为它将防止它们重叠到从顶部开始的第二个节点——但实线应该是直的。

我想了解如何微调节点、边缘和标签的位置(因为文档真的没有帮助,好的例子很难找到),但具体来说,我的问题是:

  1. 我能告诉dot使特定的边缘弯曲而保持其他边缘直线吗?(我知道有一个splineType边缘属性,但文档没有给我使用它的提示,我甚至不确定这是否是它的作用。)

  2. 如果上面的不可能,如何告诉dot将直线变成死直,而不是在标签处弯曲?

  3. 对于直线边缘,如何微调标签的位置?我不介意手动操作,似乎有几个边缘属性可以帮助我做到这一点,但它们中没有一个似乎有任何效果,所以我一定做错了什么。

作为一个额外的问题:有没有办法让节点更像网格布局,使它们垂直对齐?

任何答案都会受到赞赏,但最有帮助的答案是解释如何更普遍地处理这些问题,为了未来的访问者,而不只是修复我的代码。


不完全是你所要求的,但你可以尝试删除样条线并添加edge[decorate=true],也许还可以添加edge[minlen=2]。 - Jens
1个回答

1
如果您使用的是neato布局引擎,可以通过属性pos="x,y"来设置节点的显式坐标。在dot布局引擎中,可以使用{rank=same; node1; node2; ...}进行垂直对齐,并使用group属性(node1[group=g1]; node3[group=g1];)进行水平对齐。
可以使用属性headlabeltaillabel来更改

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