2011-10-15 25 views
18

Tôi muốn có đồ thị của tôi trông như thế này:đồ thị con từ trên xuống, trái ngay trong đồ thị con

Nhưng tôi chỉ có thể có được điều này:

Vấn đề là, rankdirdoes not work trong subgraph. Vì vậy, làm thế nào để mô phỏng nó?

Mã:

digraph G { 
    node [shape = circle] 
    0 [style = invis] 

    0 -> "0A" 

    subgraph clusterA { 
     label=A 
     "0A" 
     "1A" 
     "2A" -> "0A" [label=•] 
    } 

    subgraph clusterB { 
     label=B 
     "0B" 
     "1B" 
     "2B" -> "0B" [label=•] 
    } 

     subgraph clusterC { 
     label=C 
     "0C" 
     "1C" 
     "2C" -> "0C" [label=•] 
    } 

    subgraph clusterD { 
     label=D 
     "0D" 
     "1D" 
     "2D" -> "0D" [label=•] 
    } 

    subgraph clusterE { 
     label=E 
     "0E" 
     "1E" 
     "2E" -> "0E" [label=•] 
    } 

    subgraph clusterF { 
     label=F 
      {node [shape = doublecircle] "0F" "1F"} 
     "2F" -> "0F" [label=•] 
    } 

    "0A" -> "1B" [label=a] 
    "1A" -> "2B" [label=a] 
    "0B" -> "1C" [label=b] 
    "1B" -> "2C" [label=b] 
    "0C" -> "1D" [label=c] 
    "1C" -> "2D" [label=c] 
    "0D" -> "1E" [label=d] 
    "1D" -> "2E" [label=d] 
    "0E" -> "1F" [label=e] 
    "1E" -> "2F" [label=e] 
} 

Trả lời

31

Tái bố trí đồ thị nói riêng thường có thể đạt được với:

  • nút vô hình và cạnh
  • hạn chế cấp bậc

Đây là cách tôi sao chép đồ thị của bạn - hoặc ít nhất là một phần của nó:

digraph g { 
    rankdir="LR"; 
    node[shape = circle, fontsize=14]; 
    fontsize=18; 
    labeljust="l"; 

    edge[style=invis, fontsize=12]; 

    { rank=same; 
     0 [style = invis]; 
     01 [style = invis]; 
     02 [style=invis]; 
     0 -> 01 -> 02; 
    } 

    subgraph clusterA { 
     "0A" -> "1A" -> "2A"; 
     "2A" -> "0A" [label=".", constraint=false, style=solid]; 
     label="A"; 
    } 

    subgraph clusterB { 
     "0B" -> "1B" -> "2B"; 
     "2B" -> "0B" [label=".", constraint=false, style=solid]; 
     label="B"; 
    } 

    subgraph clusterC { 
     "0C" -> "1C" -> "2C"; 
     "2C" -> "0C" [label=".", constraint=false, style=solid]; 
     label="C"; 
    } 

    0 -> "0A"[style=solid]; 
    01 -> "0B"[style=invis]; 
    02 -> "0C"[style=invis]; 

    // edges between clusters 
    edge[constraint=false, style=solid]; 
    "0A" -> "1B" [label=a] 
    "1A" -> "2B" [label=a] 
    "0B" -> "1C" [label=b] 
    "1B" -> "2C" [label=b] 
} 

Giải pháp này không phải là rất trực quan. Một vài điểm để đạt được điều này:

  • tôi đã chọn rankdir="LR" đó dẫn đến cạnh đẹp hơn TB, mặc dù nó không thực sự phù hợp với sự chỉ đạo của đồ thị
  • nút vô hình và cạnh đang sử dụng cho các nút xếp hạng hàng đầu (0, 01, 02) để có các cụm căn chỉnh bên trái.
  • Các nút trên cùng (vô hình) bị buộc phải xếp hạng giống nhau và được liên kết bởi các cạnh vô hình - điều này sẽ đảm bảo rằng các cụm được liên kết với mỗi nút xuất hiện theo đúng thứ tự.

Kết quả là:

graphviz output

+0

@ jason-s Cảm ơn các tiền thưởng! Khá bất ngờ, nhiều năm sau khi gửi câu trả lời này! – marapet

1

Sử dụng chế = false sẽ nhận được các nút trong đồ thị con của bạn để biến ra theo cách bạn muốn http://www.graphviz.org/doc/info/attrs.html#d:constraint

subgraph clusterB { 
    label=B 
    "0B" 
    "1B" 
    "2B" -> "0B" [constraint=false label=•] 
} 

Sau đó bạn sẽ thấy rằng đồ thị con của bạn không xếp hàng với nhau theo cách bạn muốn. Một cái gì đó như thế này có thể giải quyết điều đó.

"0A" -> "0B" -> "0C" -> "0D" -> "0E" [weight=999 style=invis]; 
Các vấn đề liên quan