【问题标题】:How does a script optimally layout a pure hierarchical graphviz/dot graph?脚本如何以最佳方式布局纯分层 graphviz/dot 图?
【发布时间】:2012-03-03 13:33:55
【问题描述】:

我即将编写一个脚本来生成具有以下两个特征的graphviz/dot graphs:

  1. 除了一个节点之外的所有节点都只有一个父节点(因此,它是一棵树)。
  2. 如果两个或多个节点共享样本父节点,则它们本身是 按特定顺序。

有了这些特征,我希望我的结果(即点生成图)看起来像这样:

  1. 边缘不应交叉
  2. 具有相同父节点的节点与图形顶部边框的距离应相同。
  3. 具有相同父节点的节点应按照从左到右的顺序绘制 按照他们的要求

但是,我无法让 dot 以我想要的方式运行。这是一个点文件来演示我的问题:

digraph G {

  node [shape=plaintext fontname="Arial"];

  0  [label="zero"      ];
  1  [label="one"       ];
  2  [label="two"       ];
  3  [label="three"     ];
  4  [label="four"      ];
  5  [label="five"      ];
  6  [label="six"       ];
  7  [label="seven"     ];
  8  [label="eight"     ];
  9  [label="nine"      ];
  10 [label="ten"       ];
  11 [label="eleven"    ];
  12 [label="twelve"    ];
  13 [label="thirteen"  ];
  14 [label="fourteen"  ];
  15 [label="fivteen"   ];
  16 [label="sixteen"   ];
  17 [label="seventeen" ];
  18 [label="eighteen"  ];
  19 [label="nineteen"  ];
  20 [label="twenty"    ];
  21 [label="twenty-one"];
  22 [label="twenty-two"];

  0  -> 1  [arrowhead=none];
  1  -> 2  [arrowhead=none];
  2  -> 7  [arrowhead=none];
  7  -> 8  [arrowhead=none];
  8  -> 9  [arrowhead=none];
  8  -> 10 [arrowhead=none];
  9  -> 10 [color="#aaaaaa" constraint=false];
  10 -> 11 [arrowhead=none];
  10 -> 12 [arrowhead=none];
  11 -> 12 [color="#aaaaaa" constraint=false];
  7  -> 13 [arrowhead=none];
  8  -> 13 [color="#aaaaaa" constraint=false];
  13 -> 14 [arrowhead=none];
  7  -> 15 [arrowhead=none];
  13 -> 15 [color="#aaaaaa" constraint=false];
  15 -> 16 [arrowhead=none];
  15 -> 17 [arrowhead=none];
  16 -> 17 [color="#aaaaaa" constraint=false];
  2  -> 3  [arrowhead=none];
  7  -> 3  [color="#aaaaaa" constraint=false];
  3  -> 4  [arrowhead=none];
  2  -> 5  [arrowhead=none];
  3  -> 5  [color="#aaaaaa" constraint=false];
  5  -> 6  [arrowhead=none];
  2  -> 18 [arrowhead=none];
  5  -> 18 [color="#aaaaaa" constraint=false];
  18 -> 19 [arrowhead=none];
  19 -> 20 [arrowhead=none];
  19 -> 21 [arrowhead=none];
  20 -> 21 [color="#aaaaaa" constraint=false];
  18 -> 22 [arrowhead=none];
  19 -> 22 [color="#aaaaaa" constraint=false];
}

结果

注意,兄弟姐妹之间的顺序由灰色边缘(箭头)表示。

因此,例如,我对 七 -> 三 -> 五 -> 十八 个兄弟姐妹感到满意,因为它们是按照正确的顺序从左到右绘制的(如箭头所示)。

但我对兄弟姐妹 8 -> 13 -> 15 不满意,因为他们的边与其他边交叉,而且他们的顺序不是从左到右,正如我所愿。

另外,9 -> 1020 -> 2119 -> 22 方向错误。

我知道我可能会得到一张我想要的图片如果我使用了额外的(不可见的)边缘和weight 属性,甚至可能还有更多功能。但由于图表(其中有很多)是由脚本生成的,我无法手动执行。

那么,有没有办法实现我想要的?

【问题讨论】:

    标签: generator hierarchy graphviz dot


    【解决方案1】:

    在这种情况下,它实际上非常简单:脚本中节点的出现顺序很重要。在您的脚本中,它们出现在节点 0 到节点 22 之间,并且布局尽可能地尊重这一点。但是,它们应该按照您添加边的顺序出现(0、1、2、7、3、5、18,...)。因此,最简单的解决方案是移动定义标签的块定义边缘的块,你会得到:

    没有权重,没有不可见的边,也没有不可见的节点。

    【讨论】:

    • 那么,一般来说,node-id 越早出现在 dotfile 中,越是对应的节点出现在左侧?
    • 看起来是这样,至少在这种情况下没有边缘交叉的情况下。否则 dot 将尝试最小化边缘交叉。 Emden Ganser 最近在 graphviz 论坛上有趣的相关评论:graphviz.org/content/…
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2019-09-02
    • 2019-09-11
    • 2011-01-17
    • 2018-03-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多