2011-10-15 9 views
18

Chciałbym mieć mój wykres wygląda następująco:subgraphs top-dół, lewo-prawo wewnątrz subgraphs

Ale mogę to tylko:

Problem jest następujący: rankdirdoes not work w subgraph. A więc, jak to naśladować?

Kod:

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

Odpowiedz

31

odtwarzających poszczególne układy wykres zwykle można osiągnąć:

  • Invisible węzły i krawędzie
  • ograniczeń rangi

Oto jak ja powielana swój wykres - albo przynajmniej część to:

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

To rozwiązanie nie jest zbyt intuicyjne. Kilka punktów do osiągnięcia tego celu:

  • Wybrałem rankdir="LR" co zaowocowało ładniejszych krawędziach niż TB, choć tak naprawdę nie odpowiadają kierunku wykresu
  • Invisible węzły i krawędzie są używać do węzły najwyższej rangi (0, 01, 02), aby klastry były wyrównane w lewo.
  • (Niewidoczne) górne węzły są zmuszone do tej samej wartości i są połączone niewidzialnymi krawędziami - to zapewni, że klastry połączone z każdym węzłem pojawią się we właściwej kolejności.

Wynikiem jest:

graphviz output

+0

@ Jason-s Dzięki za laska! Całkiem nieoczekiwane lata po przesłaniu tej odpowiedzi! – marapet

1

Korzystanie ograniczenie = false powinien dostać węzły w swoim subgraphs okazać się tak, jak chcesz http://www.graphviz.org/doc/info/attrs.html#d:constraint

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

Po tym przekonasz się, że swoimi subgraphs nie ustawiajcie się tak, jak chcesz. Coś takiego mogłoby to rozwiązać.

"0A" -> "0B" -> "0C" -> "0D" -> "0E" [weight=999 style=invis]; 
Powiązane problemy