2013-06-28 45 views
6

我目前正在用Java寫一個圖庫,並且我想要一個工具來可視化一些圖。我發現了Graph-viz,這是一個很好的 - 雖然是錯誤的方式 - 這樣做。Graphviz(xdot):如何製作遞歸節點?

在我的模型,圖表是由節點邊緣。每個節點有一定數量的端口(I/O/IO)和邊緣鏈接那些端口在一起。一些特殊的節點被稱爲GraphNode並嵌入了一個。這些端口這些圖表節點被映射到一些端口的內部節點

我想提供幾種表示形式。他們的第一,與我滿意,如下:http://i.stack.imgur.com/ujU71.png

輸入端口以綠色來表示,紅色輸出的,而在藍色輸入輸出的。

在此表示,在GraphNodes沒有擴展並顯示一樣簡單節點。在第二個版本中,我想創建如下圖所示的內容:http://i.stack.imgur.com/Cx624.png

問題是我無法設法創建具有固定區域的子圖(集羣)(它似乎不是可能)。我嘗試的另一個解決方案是將圖形嵌入到節點中。然而,插入一些代碼轉換成HTML標籤的<td> </td>部分不評估代碼:

digraph graph0 
{ 

    node1 
    [ 
     label = 
     < 
      <table border="0" cellspacing="0"> 
       <tr> 
        <td cellpadding="0"> 
         <table border="0" cellspacing="0"> 
          <tr> 
           <td bgcolor="palegreen" border="1" port="port2">port2</td> 
           <td bgcolor="palegreen" border="1" port="port3">port3</td> 
          </tr> 
         </table> 
        </td> 
       </tr> 
       <tr> 
        <td cellpadding="0"> 
         <table border="0" cellspacing="0"> 
          <tr> 
           <td cellpadding="0"> 
            <table border="0" cellspacing="0"> 
             <tr> 
              <td bgcolor="skyblue" border="1" port="port5">port5</td> 
             </tr> 
            </table> 
           </td> 
           <td bgcolor="peachpuff" border="1"> 

            subgraph clusterTest 
            { 
             nodeTest 
            } 

           </td> 
          </tr> 
         </table> 
        </td> 
       </tr> 
       <tr> 
        <td cellpadding="0"> 
         <table border="0" cellspacing="0"> 
          <tr> 
           <td bgcolor="lightpink" border="1" port="port4">port4</td> 
          </tr> 
         </table> 
        </td> 
       </tr> 
      </table> 
     > 
     style = "invisible" 
    ] 

} 

前面的代碼創建如下圖:http://i.stack.imgur.com/E9jQ1.png

最後,最好的解決辦法,我能想出是以下內容:http://i.stack.imgur.com/VzS5g.png

不過我並不滿足於它,因爲GraphNodes端口放置在陌生的地方的時候。

你知道我如何達到目標圖形佈局嗎?如有需要,請詢問任何其他信息。


編輯:我依然沒有找到任何解決方案。處理這種情況的一種方法是能夠修復包含集羣內給定節點的位置,但似乎不可能用「點」佈局。任何想法 ?

回答

1

使用有向圖,可以指定節點的位置(相對於彼此)。這可以用來強制某些元素出現在其他元素之上。而其他節點可以強制出現在同一水平上(端口101和102在此實例中)

假嵌套:該圖不使用嵌套的明文/半HTML節點,因爲我不認爲這是可能的(不是功能)。我不確定是否有任何graphviz庫支持它們,但可能需要查看其他庫。我甚至從來沒有使用Java或Python中的點,否則我會提出一個建議。


nesting


有向圖{ nodesep = 0.2 ranksep = 0.8 墊= 0.1 節點[形狀=正方形] 節點[風格=填充] 邊緣[箭頭=無]

// rankdir = LR

component_starter [標號= < port02 port03 port06 小號 port07 port08 port04 port05 >風格= 「隱形」]

子圖cluster_container { 標籤=「I/O帶有組件的設備「 color = orange

//margin = 0 
edge [ style="invis"] 
//edge [ len="0.5" minlen="1" ] 
node [ height="0.5" width="2" fixedsize=true ]; 
node [ shape=rectangle style=filled ] 
{ 
node [ color=palegreen ]; 
    { rank = same port101 -> port102 } 
} 
{ 
node [ color=skyblue]; 
    port103 port104 } 
{ 
node [ height="1.5" width="2" fixedsize=true ]; 
node [ color=peachpuff]; 
    //notaport 
} 
{ 
node [ height="0.5" width="4" fixedsize=true ]; 
node [ color=lightpink]; 
    output 
} 

// -

//subgraph cluster_inner { 
    //label="abstractions" 
    //color="black" 
    //style="invis" 
    component_a [ label = < 
     <table border="0" cellspacing="0"><tr> 
      <td border="1" bgcolor="white" > </td> 
      <td border="1" bgcolor="palegreen" port="port2">port2</td> 
      <td border="1" bgcolor="palegreen" port="port3">port3</td> 
     </tr><tr> 
      <td border="1" bgcolor="skyblue" port="port6">port6</td> 
      <td border="1" bgcolor="peachpuff" rowspan="3" colspan="2">A</td> 
     </tr><tr> 
      <td border="1" bgcolor="skyblue" port="port7">port7</td> 
     </tr><tr> 
      <td border="1" bgcolor="skyblue" port="port8">port8</td> 
     </tr><tr> 
      <td border="1" bgcolor="lightpink" colspan="1" port="port4">port4</td> 
      <td border="1" bgcolor="lightpink" colspan="2" port="port5">port5</td> 
     </tr></table> > style = "invisible" ] 

    component_b [ label = < 
     <table border="0" cellspacing="0"><tr> 
      <td border="1" bgcolor="white" > </td> 
      <td border="1" bgcolor="palegreen" port="port22">port22</td> 
      <td border="1" bgcolor="palegreen" port="port23">port23</td> 
     </tr><tr> 
      <td border="1" bgcolor="skyblue" port="port25">port25</td> 
      <td border="1" bgcolor="peachpuff" colspan="2"> B </td> 
     </tr><tr> 
     <td border="1" bgcolor="lightpink" colspan="3" port="port24">port24</td> 
     </tr></table> > style = "invisible" ] 

// -

component_c [ label = < 
     <table border="0" cellspacing="0"><tr> 
      <td border="1" bgcolor="white" > </td> 
      <td border="1" bgcolor="palegreen" port="port32">port32</td> 
      <td border="1" bgcolor="palegreen" port="port33">port33</td> 
     </tr><tr> 
      <td border="1" bgcolor="skyblue" port="port35">port35</td> 
      <td border="1" bgcolor="peachpuff" colspan="2"> C </td> 
     </tr><tr> 
     <td border="1" bgcolor="lightpink" colspan="3" port="port34">port34</td> 
     </tr></table> > style = "invisible" ] 
//} 


port101 -> port103 
port102 -> component_a 
port102 -> component_b 
port103 -> port104 

component_a -> output; 
component_b -> output; 
component_c -> output; 

edge [ style="" arrowhead="normal" color="#444444"] 
component_a:port4 -> output; 

component_c:port34 -> component_a:port3; 
component_a:port5 -> component_b:port22; 

port101 -> component_c:port33 

// -

{ rank = same 

    edge [ dir=back ] 
    port104 -> component_a:port8 
} 

} 

component_starter; 
component_starter:port5 -> port101; 

} 

上述點文件,壓縮。使用base64 -d nesting.bz2.base64 |bzcat來查看它。

QlpoOTFBWSZTWd/epEIABCzfgHAwWAP/3zgkmAq/7//6UASZm8a7VNrQBQQlSDUaYjTINGjIyZAG 
ho0aNMgkUZJpEIzUw0TTEzQBoAIwCTUiFT1NppDymGk0Pap6gMmCaAAcwAAAAAAAAAAFSRJoGp6B 
TyNTyhABoD1DQ0aephLyAcTAhMSQiKogMBLsVaZBYIwUHIGFISYVKCMVkRgLypG2mhHPb5z0hBap 
yN3HCL2iJVDYvXI6SykmzPN9LCaex+63c7jyTnk18c2KgvDZq6Kkz+WWf4DU4KoQsCQJ1gKpAcwC 
mp5nGnmlI8wBNtgDi+Hmf0/g/v4PoNaZVrhy5cdWCavJkutPC0t50kljBJLHXrbQUjJMPPDCUKwN 
NHO8aaiqKTus3tLEpprCW8Gzr68DtvyteHrqa7JJ9J46R4muUMuU39kJYPEgwJWwCSqsgMteezTo 
ta1rr3va1sccdW/32OJUROFkmUzqeyHn+g96EccgEY5SfJixh2aJgQC0JVmWAtrdagoOkDZAViKA 
qUpGZ1dXNJikmmsRZmAO16Kq9osW7KzzPZPS9IeLIqXo0cOoNwatry3Mi792YMRvA3oiKxe84ac7 
EMGmdrabTaG0qqDpAMJJn5IeAbvMNiSJW8og7y+Ik+CExJBhLDZlKFSFKMBgIIMai57J5pLmgl5R 
Qm261e797RF6qhy82NQypLEa8ktUVAL2R1hxThWC3pVB0jBThRxVLfHHJeZHv+pMEkxZ3P6KP+ho 
QWyC9gtIM2cxJK2pIiiIooOPlxE0kkspJPijcgrHRHw6XvMpwy5ldiqlUpWzvymgxr78zAXh4vSW 
L3jya8Hqc6ekwhhDROybThDBnIdmdlN6ClO8bo7ucxNqSVjHNGd8F8ocW2qmT0bJRujojA9MJqnC 
TPg09tZlJ5d/am7W8E6GeU3TkyVC0N5nTgeXXn7Sj1UWijm1Q07OKeXiyPbENRSNcNzrnkyxkNeu 
RgS5GWEXKkpTdIy8NenUhVYpqkbUCushe+cQ15oMcRIrb4GZscDDVmLk3LF7Txk6yFvmky8aoiK5 
T+3pVRjVVVUtLRVFFI0q1lrpHlGqNnHKOVIKkktUYAuq2L1bekwQeG68LX3tK64kVNRw2tDb7rLn 
acBl0J61Ld57HXXHKpXLjoqAo5yyRvQ/YxLdufjNCSaEk4mmYLcZp1ybI1BqDTum20PSm2cId4pU 
Zx00pZzOJZwnSHjAqXNkWCM4s/+LuSKcKEhv71IhAA== 
+0

我把它放在你的腿上,因爲我現在必須跑。讓我知道如果有問題(細節),我可以添加到答案... –

+0

嗨!感謝您的回答,對不起,我以前無法測試它。然而,我無法設法讓它運行。看起來Python在撤回屬性「寬度」方面失敗了。你用什麼版本的Xdot來形象化它(我的是0.4)?或者另一個軟?無論如何,你的答案對我來說看起來很完美! –

+0

我用graphviz直接渲染。點 - graphviz版本2.26.3 –