2012-02-11 25 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