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

时间:2018-06-16 13:42:44

标签: graphviz dot

来自此图表:

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在图的中间?

2 个答案:

答案 0 :(得分:2)

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

enter image description here

答案 1 :(得分:0)

使用constraint = false似乎会导致“特殊”结果。

下图给出了所需的结果。 看起来像在自然排名中构造节点,并且使用dir = back效果更好。

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