【问题标题】:Graphviz: How to get fixed node positionsGraphviz:如何获得固定节点位置
【发布时间】:2017-11-15 23:47:53
【问题描述】:

我对 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 并添加“后退”选项,则布局将恢复为原始布局。

您有什么线索吗?是否有办法避免节点的位置在任何最小弧修改时发生变化?

非常感谢您的帮助。

【问题讨论】:

    标签: graph graphviz


    【解决方案1】:

    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"]
    }
    

    产量

    【讨论】:

    • 谢谢。正如我在消息中所写的,经过一些初步的努力,我发现“后退”选项将布局放回了所需的位置。我现在知道为什么了:我现在不知道默认设置和相关行为。
    • 将我的回复标记为正确答案/赞成-谢谢...
    • 嗨,我很抱歉,vaettchen!是的,您的回答非常有价值,对我帮助很大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2017-05-13
    • 2019-08-29
    • 1970-01-01
    • 2013-03-23
    • 2017-06-30
    相关资源
    最近更新 更多