2014-05-21 102 views
2

我使用dot命令來生成一個圖表,這裏是一系列軟件版本,顯示了這些版本之間的關係。水平分區圖中的節點

假設:

  • 每個版本都有一個數字,數字越大,表示以後的版本。
  • 每個版本必須出現以上以前版本的圖表。
  • 每個版本都基於特定的早期版本,不一定是最新版本。
  • 每個「基於」關係顯示爲從一個節點到另一個節點的箭頭。
  • 這些版本的一些子集是分開的,因爲這個問題並不重要。我會稱他們爲「alt」版本。 「Alt」版本可以基於非「alt」版本,反之亦然。 (它發生在我對非「alt」版本更感興趣,但我希望圖中的所有版本。)

我可以生成清楚地顯示版本間關係的圖,但是我還想將所有「alt」版本放在垂直圖的右側,以及左側的所有非「alt」版本 - 同時保留所有關係信息(這意味着箭頭從左側右圖,反之亦然)。

我試過把「alt」節點放到子圖/集羣中,但是失去了集羣節點和它之外的節點之間的依賴關係(箭頭)。

我也嘗試在「中間」創建一個不可見節點,並在指定方向時從每個節點向「中間」節點定義依賴關係,但無法在同一圖形中混合垂直和水平依賴關係。

這裏的demo.dot文件,我到目前爲止,這確實做我想做的分區:

digraph releases { 
// Use a box shape for all nodes 
    node [shape=box]; 

// Define labels for nodes 
    v106 [style=bold]; 
    v105 [label="v105 alt" style=dashed]; 
    v104; 
    v103; 
    v102 [label="v102 alt" style=dashed]; 
    v101 [style=bold]; 

// Define dependencies 
    v106 -> v104; 
    v106 -> v105 [style=dashed]; 
    v105 -> v102; 
    v104 -> v101; 
    v103 -> v101; 
    v102 -> v101; 

// Use [style=invisible dir=none] to ensure that a later node appears above 
// an earlier one even if there's no dependency. 
    v106 -> v105 [style=invisible dir=none]; 
    v105 -> v104 [style=invisible dir=none]; 
    v104 -> v103 [style=invisible dir=none]; 
    v103 -> v102 [style=invisible dir=none]; 
    v102 -> v101 [style=invisible dir=none]; 

} 

而這裏的鏡像文件,用dot -Tpng demo.dot -o demo.png

demo.png

產生什麼我想要的是讓所有「alt」節點位於一條不可見的垂直線的右側,並且所有其他節點位於其左側,所有箭頭依然存在(必要時失真)。

有沒有辦法做到這一點與dot?還是有另一種工具(可用於Linux,特別是Debian)可以做同樣的事情?

回答

0

試圖做類似的事情。添加此對您的代碼靠攏:

subgraph cluster_alt { 
    graph [style= invisible]; 
    edge [style = invisible, arrowhead=none]; 
    weight = 10; 
    v102 -> v105; 
} 

subgraph cluster_main { 
    graph [style= invisible]; 
    edge [style = invisible, arrowhead=none]; 
    weight = 10; 
    v106 -> v105-> v104->v103->v102->v101; 
} 

給我: enter image description here

的「權重」屬性推在這些看不見的子圖邊朝比其他邊緣(可見那些你更多的垂直」已經定義)。

1

這是一個非常晚的答案,但可能會幫助他人。

如果兩個節點都記錄到相同的group,Graphviz會嘗試保持邊緣平直。

digraph releases { nodesep=0.5 
    // Use a box shape for all nodes 
    node [shape=box]; 

    // Define regular nodes 
    { 
     node [group=regular]; 
     v106 [style=bold]; 
     v104; 
     v103; 
     v101 [style=bold]; 
    } 

    // Define alt nodes 
    { 
     node [group=alt style=dashed]; 
     v102 [label="v102 alt"]; 
     v105 [label="v105 alt"]; 
    } 

    // Define dependencies 
    v106 -> v104; 
    v106 -> v105 [style=dashed]; 
    v105 -> v102; 
    v104 -> v101; 
    v103 -> v101; 
    v102 -> v101; 

    // Use [style=invisible dir=none] to ensure that a later node appears above 
    // an earlier one even if there's no dependency. 
    edge [style=invisible dir=none]; 
    v106 -> v105; 
    v105 -> v104; 
    v104 -> v103; 
    v103 -> v102; 
    v102 -> v101; 

} 

enter image description here

+0

這並不完全做什麼,我問了,但我認爲它確實提高了我的實際測試情況下的佈局。 –