如何理解 graphviz 点边和节点行为?

How to understand graphviz dot edge and node behavior?

来自这张图:

digraph G {

a0 -> a1 -> a2;
x0 -> x1;
b0 -> b1 -> b2;

}

这是给出这个图形表示:

a 0    x 0    b 0
 |      |      |
a 1    x 1    b 1
 |             |
a 2           b 2

我想将 a2 连接到 x1,将 x1 连接到 b2。

所以我尝试了:

digraph G {

a0 -> a1 -> a2;
x0 -> x1;
b0 -> b1 -> b2;

a2 -> x1 [constraint=false];
x1 -> b2 [constraint=false];

}

我的期望是:

a 0    x 0    b 0
 |      |      |
a 1    x 1    b 1
 |  /       \  |
a 2           b 2

但不幸的是它是这样呈现的,我不知道为什么。

a 0    b 0    x 0
 |      |      |
 |      |      |
 |      |      |
a 1    b 1    x 1
 |      | _ / / 
 |      +    / 
 |  _/   |  /  
a 2    b 2

我怎样才能更好地理解为什么会这样,并帮助我将 x0 -> x1 保持在图表的中间?

{rank=same; a0 -> x0 -> b0 [style=invis];} 添加到您的图形中会得到所需的结果 - 这会强制顶部节点按特定顺序排列,但会隐藏为此添加的边。然而,我完全不知道为什么这是必要的。

使用 constraint=false 似乎会导致 'special' 结果。

下图给出了想要的结果。 看起来在其自然排名中构建节点并使用 dir=back 效果更好。

digraph G {
    a0 -> a1 -> a2;
    x0 -> x1;
    b0 -> b1 -> b2;
    x1 -> a2 [dir=back];
    x1 -> b2;
}