2011-10-15 13 views
18

mi piacerebbe avere il mio grafico seguente aspetto:sottografi dall'alto verso il basso, da sinistra a destra all'interno sottografi

ma posso solo ottenere questo:

Il problema è, rankdirdoes not work in subgraph. Quindi, come emularlo?

Il codice:

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

risposta

31

Riprodurre particolari layout grafico di solito possono essere raggiunti con:

  • nodi invisibili e spigoli
  • vincoli rango

Ecco come ho riprodotto il grafico - o almeno una parte di esso:

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

Questa soluzione non è molto intuitiva. Un paio di punti per raggiungere questo obiettivo:

  • Ho scelto rankdir="LR" che ha provocato bordi più bello di TB, anche se in realtà non corrisponde con la direzione del grafico
  • nodi invisibili e bordi sono uso per la nodi top rank (0, 01, 02) per far allineare i cluster a sinistra.
  • I nodi superiori (invisibili) sono costretti allo stesso rango e sono collegati da bordi invisibili: ciò garantisce che i cluster collegati a ciascun nodo vengano visualizzati nell'ordine corretto.

Il risultato è:

graphviz output

+0

@ jason-s Grazie per la bontà! Piuttosto inaspettato, anni dopo aver inviato questa risposta! – marapet

1

Utilizzando vincolo = false dovrebbe ottenere i nodi nelle vostre sottografi di trasformare il modo in cui si desidera http://www.graphviz.org/doc/info/attrs.html#d:constraint

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

Dopo di che ci si accorge che i tuoi sottografi non allinearti l'un l'altro nel modo desiderato. Qualcosa del genere potrebbe risolverlo.

"0A" -> "0B" -> "0C" -> "0D" -> "0E" [weight=999 style=invis]; 
Problemi correlati