2010-08-11 8 views
4

J'utilise graphviz pour la première fois. J'ai juste besoin d'une disposition d'arbre pour que tous les enfants soient au même niveau.graphviz Tree Layout

Par exemple, A> B A> C A-> D

ALORS B, C ET D DOIVENT ETRE AU NIVEAU MEME.

Voici le code que j'utilise.

digraph unix { 
    size="6,6"; 
    node [color=lightblue2, style=filled]; 

    "A:1000" -> "B:300"; 
    "A:1000" -> "C:300"; 
    "A:1000" -> "D:200"; 
    "B:300" -> "E:140"; 
    "B:300" -> "F:164"; 
    "B:300" -> "G:75"; 
    "C:300" -> "H:135"; 
    "C:300" -> "I:91"; 
    "D:200" -> "E:140"; 
    "D:200" -> "F:164"; 
    "D:200" -> "G:75"; 
    "E:140" -> "F:164"; 
    "E:140" -> "G:75"; 
    "F:164" -> "G:75"; 
    "G:75" -> "H:135"; 
    "H:135" -> "I:91"; 
} 

Comment puis-je faire en sorte que les Childs sont au même niveau?

+0

et des conseils pour que le graphique soit cool. Je le présente à mon ami. – Sunil

Répondre

9

Pour obtenir des nœuds sur le même niveau, dites « B: 300 » et « C: 300 », ajoutez la ligne suivante:

{rank=same; "B:300" "C:300"} 
+0

Merci ars Mais si je dois générer le graphe dynamiquement, je ne saurai pas quels noeuds les frères et sœurs ritent. Je pensais que si vous écrivez, A-> B, A-> C, A-> D .. graphviz verrait que B, C et D proviennent des mêmes nœuds et doivent donc être au même niveau. – Sunil

+1

Si vous générez dynamiquement, il peut être plus simple d'ajouter une ligne 'rank' puisque vous pouvez déterminer les nœuds enfants dans votre programme. – ars

3

Le graphique que vous avez présenté ne représente pas un arbre, mais dirigé graphe acyclique (Dans un arbre, il n'y a qu'un seul chemin distinct entre chaque paire de nœuds). Si votre entrée aurait été un arbre, alors simplement utiliser dot produirait ce que vous voulez. Si vous souhaitez également ajouter des arêtes non-arborescentes, comme "C:300" -> "H:135" dans votre exemple, vous pouvez spécifier un poids inférieur pour elles, afin de vous assurer que dot n'essaie pas d'optimiser la disposition par rapport à ces arêtes.

"C:300" -> "H:135" [weight=0]; 
"C:300" -> "I:91" [weight=0]; 

Notez que ces deux bords deviennent très longs (et dot, laid) avec ce paramètre, ce qui est la raison pour laquelle le noeud "C:300" est placé comme il est dans votre graphique d'origine.

+1

Pour faire court: ce n'est pas un arbre comme C => H => I mais aussi C => I – MickaelFM