脚本如何以最佳方式布局纯粹的分层graphviz /点图?

时间:2012-02-11 07:43:34

标签: generator hierarchy graphviz dot

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

  1. 除了一个节点之外的所有节点都有一个父节点(因此,它是一棵树)。
  2. 如果两个或多个节点共享一个sampe父节点,它们本身就是  按特定顺序。
  3. 有了这些特征,我希望我的结果(即点生成的图形)看起来像这样:

    1. 没有边缘穿越
    2. 具有相同父级的节点应与图形顶部边框具有相同的距离。
    3. 应该从左到右依次绘制具有相同父节点的节点  他们的订购
    4. 然而,我不能按照我喜欢的方式表现点。这是一个用于演示我的问题的点文件:

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

      结果

      Resulting graph

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

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

      但我对兄弟姐妹 8不满意 - >十三 - > fivteen 因为他们的边缘穿过其他边缘,因为他们的顺序不是从左到右,正如我所愿。

      此外, 9 - >十二十 - >二十一十九 - >二十二的方向错误。

      我知道我可能会想到一张照片,因为我需要如果我使用了额外的(不可见的)边缘和weight属性以及可能更多的功能。但由于图形(以及其中有许多图形)是由脚本生成的,我不能手动完成。

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

1 个答案:

答案 0 :(得分:8)

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

ordered graph

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