2012-06-08 34 views
1

如果有兩個集羣包含其他集羣的層次結構。非常酷!Pydot集羣定位

我想垂直放置兩個羣集。雖然其他帖子提出瞭如何垂直放置節點(不是羣集),但我無法獲得這個適用於羣集的信息。

大小參數不適用於我,但在任何情況下,這似乎是錯誤的答案,因爲我的python程序一般列出可能是任何大小的圖表類。我只是想把兩個集羣放在另一個集羣的頂部,大小應該是什麼。

一個簡單的例子將不勝感激。

回答

1

我解決了這個問題。 我有兩個獨立的集羣,每個集羣都包含一系列子集羣並描繪成矩形。 如果我將這兩個集羣添加到我的圖中,它們顯示爲從左到右,但我希望它們一個在另一個之上。 如果我向每個羣集添加一個節點,讓它們處於垂直方向。它們可以在樣式修改器中變得不可見,但我使用節點作爲標籤。通過在兩個節點之間添加邊緣,兩個集羣以最明智的方式定位自己,以最小化邊緣長度,並將它們垂直重新排列。

在下面的示例中,我創建了兩個可能不需要的封閉塊,因爲您可以將一個節點添加到cluster1,另一個在cluster2中,但是我發現封閉塊使它更加整潔。

因此,例如;

#Assume cluster1 and cluser2 exist 

#Create enclosing cluster box 
enclosingBlock1=pydot.Cluster('eb1', label='label1',shape='rectangle') 
enclosingBlock1.add_subgraph(cluster1) 

# Add node to enclosing cluster 
node1=pydot.Node('D1',label='Diagram1') 
enclosingBlock1.add_node(node1) 

#Create second enclosing block 
enclosingBlock2=pydot.Cluster('eb2', label='label2',shape='rectangle') 
enclosingBlock2.add_subgraph(cluster2) 
# Add the node and create the joining edge 
node2=pydot.Node('D2',label='Diagram2') 
enclosingBlock2.add_node(node2) 
edge = pydot.Edge(node1,node2) 

graph.add_subgraph(enclosingBlock1) 
graph.add_subgraph(enclosingBlock2) 
graph.add_edge(edge) 
graph.write('xmlSQL.png',prog = 'dot',format = 'png') 
0

排名集羣問題的適當解決方案描述爲here。它涉及在某些邊緣上設置constraint = false,以便dot在對節點進行排名時將忽略它們。

在鏈接的文章中,該方法是啓發式描述的。在自動生成control flow graphs時爲我工作的方法是在後沿設置假constraint。在CFG中,後向邊是從循環體的出口返回到入口的那些邊緣,所以如果您的應用程序涉及這些可識別的邊,那麼可以將其自動化,否則它仍可用作手動選擇邊的指導原則。

如果這些可識別的邊緣不是從有關問題的先驗結構信息中知道的,但是您仍然希望自動解除邊緣的約束,那麼您可以使用DFS或BFS樹(您的選擇)來選擇邊緣的子集作爲落後。