2012-02-11 72 views
1

我要写的是具有以下两个特点产生的graphviz /点图表的脚本:脚本如何优化布局纯层次graphviz /点图?

  1. 所有除一个节点有excactly一个父节点(所以,这是一个树)。
  2. 如果两个或两个以上节点共享sampe父节点,它们本身是按照特定顺序排列的 。

有了这些特点,我想我得到的(即点产生曲线)看起来像这样:

  1. 没有边缘应跨越
  2. 节点具有相同父应该有距图顶部边界相同的距离。
  3. 节点具有相同父应绘制从左至右根据 自己订购

但是,我不能让点的行为,我想的方式。这里有一个点的文件来证明我的问题:

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

注意,兄弟姐妹之间的顺序是由灰色边缘(箭头)表示。所以,例如,我很高兴与七个>三>五个>十八个兄弟姐妹,因为他们是从左到右以正确的顺序(如箭头所示)绘制的。

但我不满意兄弟姐妹八 - >十三 - >十五,因为他们的边缘交叉其他边缘,因为他们的顺序是不是从左到右,如我所愿。

此外,- 九> 1020 - > 2119 - > 22是在错误的方向。

我知道我大概可以得到一张照片,因为我想如果使用额外的(无形)的边缘和weight属性,甚至可能更多的功能。但是,由于图表(以及其中的许多图表)是由脚本生成的,所以我无法手动执行此操作。

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

回答

7

在这种情况下,它实际上非常简单:脚本中节点的出现顺序很重要。在你的脚本中,它们从节点0到节点22出现,并且尽可能地遵守它。但是,它们应该按照您添加边缘的顺序出现(0,1,2,7,3,5,18,...)。因此,简单的办法就是此举定义边缘后挡定义标签块,你会得到:

ordered graph

没有权,没有可见边和没有无形的节点。

+0

那么,一般来说,在点文件中出现越早的节点ID,就越像是在左边出现相应的节点? – 2012-02-11 12:29:18

+0

看起来像这样,至少如果没有边缘交叉,就像在这种情况下一样。否则,点将尽量减少边缘交叉。有趣的最近Emden Ganser在graphviz论坛上的相关评论:http://www.graphviz.org/content/does-dot-layout-optimization-work-not-perfect#comment-770 – marapet 2012-02-11 13:25:43