Graphviz:如何获得固定的节点位置

时间:2017-11-15 23:47:53

标签: graph graphviz

我是Graphviz的新手,对不起,如果我的问题太天真了。

在dot中,我试图获得几个图形图像,其中节点处于固定位置,但具有不同的弧形。然而,即使是弧形配置的微小修改,也会在布局上产生巨大差异。我找到了一些解决方法(通过将某些对冲保持为隐形,或使用"返回"选项)。但是,我想知道是否有更优雅的方法来避免这种情况,其中一个弧形方向的唯一修改给出了完全不同的布局。

例如,请看:

digraph exempleUPFM {
label=mylab;
ratio = 0.5;
spline = line; forcelabels=true;
node [shape = circle;style=filled; color=lightgrey;];
1 [xlabel="10" fontcolor= blue group=g1];
4 [xlabel="-6" fontcolor= red group=g1];
2 [xlabel="4" fontcolor= blue group=g2];
5 [xlabel="-8" fontcolor= red group=g2];
node [shape = circle; style=""]
{rank=same; 1 2}
{rank=same; 4 5}
1 -> 2 [label=" 1"]
1 -> 3 [label=" 8"]
1 -> 4 [label=" 1"]
2 -> 3 [label=" 2"]
3 -> 4 [label=" 1"]
3 -> 5 [label=" 4"]
4 -> 5 [label=" 12"]
5 -> 2 [label=" -7"]
}

或者

digraph exemple2UPFM {
label=mylab;
ratio = 0.5;
spline = line; forcelabels=true;
node [shape = circle;style=filled; color=lightgrey;];
1 [xlabel="10" fontcolor= blue group=g1];
4 [xlabel="-6" fontcolor= red group=g1];
2 [xlabel="4" fontcolor= blue group=g2];
5 [xlabel="-8" fontcolor= red group=g2];
node [shape = circle; style=""];
{rank=same; 1 2}
{rank=same; 4 5}
1 -> 2 [label=" 1"]
1 -> 3 [label=" 8"]
1 -> 4 [label=" 1"]
2 -> 3 [label=" 2"]
3 -> 4 [label=" 1"]
3 -> 5 [label=" 4"]
5 -> 4 [label="-12"]
5 -> 2 [label=" -7"]
}

在这种特殊情况下,唯一的区别是弧线方向在5和4之间。但是图形布局的差异是残酷的。在第二个例子中,如果我保持弧4 - > 5,我添加"返回"选项,布局恢复原状。

你是否有任何线索,为什么有一种方法可以避免节点的位置在任何最小弧修改时改变?

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:2)

graphviz并不知道您希望图表看起来如何。它按照您给出的说明进行计算。在默认布局(从上到下)中,当您说A -> B时,它将第一个节点置于第二个节点的顶​​部,如果它们具有相同的等级,则将第一个节点放在第二个节点的左侧。如果你粗暴地看着""改变了布局,你看到了逻辑。

因此,如果您想继续使用第一个商家信息的节点安排,那么在这两种情况下说2 -> 5[ dir = back ]都是一个更安全的选择,4 -> 5[ dir = back ]应该毫不奇怪。如果你保留graphviz'在逻辑上,您应该能够在大多数情况下对布局进行排序。不可见的节点和边缘,或者为边缘增加权重是下一个层次。

只是为了说明一下:

digraph exempleSO 
{
    label=mylab;
    ratio = 0.5;
    spline = line;
    forcelabels=true;

    node [shape = circle;style=filled; color=lightgrey;];
    1 [xlabel="10" fontcolor= blue group=g1];
    4 [xlabel="-6" fontcolor= red group=g1];
    2 [xlabel="4" fontcolor= blue group=g2];
    5 [xlabel="-8" fontcolor= red group=g2];

    node [shape = circle; style=""]
    {rank=same; 1 2}
    {rank=same; 4 5}
    1 -> 2 [label=" 1"]
    1 -> 3 [label=" 8"]
    1 -> 4 [label=" 1"]
    2 -> 3 [label=" 2"]
    3 -> 4 [label=" 1"]
    3 -> 5 [label=" 4"]
    4 -> 5 [dir = back, label=" 12 back"]
    2 -> 5 [dir = back, label=" -7 back"]
}

产量

enter image description here