2013-06-28 28 views
6

Tôi hiện đang viết một thư viện đồ thị trong Java và tôi muốn một công cụ trực quan hóa một số biểu đồ. Tôi đã phát hiện ra Graph-viz, điều này xảy ra là một cách tuyệt vời - mặc dù có lỗi khi làm điều này.Graphviz (xdot): Làm thế nào để tạo các nút đệ quy?

Trong mô hình của tôi, Đồ thị được cấu tạo của NodesEdges. Mỗi Node có một số lượng nhất định cổng (I/O/IO) và Edges liên kết những cổng với nhau. Một số nút đặc biệt được gọi là Đồ thị và nhúng Biểu đồ. Các số Cổng trong số này Đồ thị được ánh xạ tới một số Cổng của nội bộ Nút.

Tôi muốn cung cấp một số đại diện. Việc đầu tiên của họ, mà tôi hài lòng, là như sau: http://i.stack.imgur.com/ujU71.png

Các đầu vào cổng được trình bày trong xanh, những cái đầu ra màu đỏ, và những cái đầu vào-đầu ra màu xanh lam.

Trong đại diện này, Đồ thị không được mở rộng và được hiển thị đơn giản như Nút. Trong phiên bản thứ hai, tôi muốn tạo một thứ gì đó giống như hình sau: http://i.stack.imgur.com/Cx624.png

Vấn đề là tôi không thể tạo một biểu đồ con (cụm) với các khu vực cố định (dường như không phải là khả thi). Một giải pháp khác mà tôi đã thử là nhúng biểu đồ vào một nút. Tuy nhiên, chèn một số mã vào <td> </td> một phần của một nhãn HTML không đánh giá mã:

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" 
    ] 

} 

Đoạn mã trên tạo ra các đồ thị dưới đây: http://i.stack.imgur.com/E9jQ1.png

Cuối cùng, giải pháp tốt nhất mà tôi có thể đưa ra là như sau: http://i.stack.imgur.com/VzS5g.png

Tuy nhiên tôi không hài lòng với nó, vì GraphNodes 'cổng được đặt tại các địa điểm kỳ lạ đôi khi.

Bạn có biết cách tôi có thể tiếp cận bố cục biểu đồ mục tiêu không? Vui lòng yêu cầu bất kỳ thông tin nào khác nếu cần.


EDIT: Tôi vẫn không tìm thấy giải pháp nào. Một cách để xử lý điều này là có thể sửa vị trí của các nút đã cho bên trong cụm chứa, nhưng có vẻ như không thể thực hiện với bố cục "chấm". Bất kỳ ý tưởng ?

Trả lời

1

Sử dụng biểu đồ, người ta có thể chỉ định vị trí của các nút (tương đối với nhau). Điều này có thể được sử dụng để buộc các yếu tố nhất định xuất hiện phía trên những phần tử khác.Trong khi các nút khác có thể bị buộc phải xuất hiện trên cùng một mức (cổng 101 và 102 trong ví dụ này)

Fake làm tổ: đồ thị này không sử dụng lồng nhau hạch rõ/bán html bởi vì tôi không nghĩ đó là có thể (không phải là một tính năng). Tôi không chắc chắn nếu bất kỳ thư viện graphviz hỗ trợ cho họ, nhưng nó có thể là giá trị nhìn vào các thư viện khác. Tôi chưa bao giờ sử dụng dấu chấm từ Java hoặc Python, nếu không tôi sẽ đưa ra một gợi ý.


nesting


digraph { nodesep = 0,2 ranksep = 0,8 pad = 0,1 nút [hình = vuông] nút [style = điền] cạnh [mũi tên = none]

// rankdir = LR

component_starter [label = < port02 port03 port06 S port07 port08 port04 port05 > style = "vô hình"]

đồ thị con cluster_container { label = "I/O thiết bị có các thành phần " 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; 

} 

Trên chấm tập tin, nén. Sử dụng base64 -d nesting.bz2.base64 |bzcat để xem.

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

Tôi đang bỏ điều này trong lòng của bạn, bởi vì tôi phải chạy ngay bây giờ. Hãy cho tôi biết nếu có câu hỏi (chi tiết) tôi có thể thêm vào câu trả lời ... –

+0

Xin chào! Cảm ơn câu trả lời của bạn, xin lỗi tôi không thể kiểm tra nó trước. Tuy nhiên tôi không thể quản lý để làm cho nó chạy. Có vẻ như Python đang thất bại trên thuộc tính retreiving 'width'. Bạn sử dụng phiên bản Xdot nào để hình ảnh hóa nó (của tôi là 0,4)? Hoặc mềm khác? Dù sao, câu trả lời của bạn trông hoàn hảo với tôi! –

+0

Tôi trả lại trực tiếp với graphviz. dot - graphviz phiên bản 2.26.3 –

Các vấn đề liên quan