2010-06-23 4 views
1

Y at-il un paramètre dans graphviz pour générer des diagrammes équilibrés comme ceci:Comment obtenir des diagrammes équilibrés de graphviz?

correct diagram http://img3.imageshack.us/img3/6423/testaah.png

Lorsque schéma est plus complexe comme ci-dessous - il est pas équilibré comme celui ci-dessus (4 est inférieur **).

not correctly balanced http://img51.imageshack.us/img51/6632/test2b.png

code pour générer deuxième diagramme:

graph 
{ 
    n1 [label="+"]; 
    n1 -- n2; 
    n2 [label="/"]; 
    n2 -- n3; 
    n3 [label="*"]; 
    n3 -- n4; 
    n4 [label="1"]; 
    n3 -- n5; 
    n5 [label="2"]; 
    n2 -- n6; 
    n6 [label="3"]; 
    n1 -- n7; 
    n7 [label="**"]; 
    n7 -- n8; 
    n8 [label="4"]; 
    n7 -- n9; 
    n9 [label="5"]; 
} 

Répondre

2

Vous pouvez "introduire de nouveaux noeuds, invisibles pour rééquilibrer la mise en page." (Voir http://www.graphviz.org/content/FaqBalanceTree). Donc, votre code devient:

graph 
{ 
    n1 [label="+"]; 
    n2 [label="/"]; 
    n1 -- n2; 
    n1b1 [label="", width=.1, style=invis] 
    n1 -- n1b1 [style=invis] 
    n1b2 [label="", width=.1, style=invis] 
    n1 -- n1b2 [style=invis] 
    n1b3 [label="", width=.1, style=invis] 
    n1 -- n1b3 [style=invis] 
    n7 [label="**"]; 
    n1 -- n7; 
    { rank=same n2 -- n1b1 -- n1b2 -- n1b3 -- n7 [style=invis] } 

    n3 [label="*"]; 
    n2 -- n3; 
    n2b1 [label="", width=.1, style=invis] 
    n2 -- n2b1 [style=invis] 
    n6 [label="3"]; 
    n2 -- n6; 
    { rank=same n3 -- n2b1 -- n6 [style=invis] } 

    n8 [label="4"]; 
    n7 -- n8; 
    n7b1 [label="", width=.1, style=invis] 
    n7 -- n7b1 [style=invis] 
    n9 [label="5"]; 
    n7 -- n9; 
    { rank=same n8 -- n7b1 -- n9 [style=invis] } 

    n3 -- n4; 
    n4 [label="1"]; 
    n3 -- n5; 
    n5 [label="2"]; 
} 

Avec cette sortie:

alt text

+0

merci, ça a l'air génial. – user360872

1

Pour cet exemple, tout ce que vous avez besoin est de desserrer le poids des bords entre les 3 premiers bords:

graph g{  
    n1 [label="+"]; 
    n1 -- n2 [weight=0]; 
    n2 [label="/"]; 
    n2 -- n3; 
    n3 [label="*"]; 
    n3 -- n4; 
    n4 [label="1"]; 
    n3 -- n5; 
    n5 [label="2"]; 
    n2 -- n6; 
    n6 [label="3"]; 
    n1 -- n7 [weight=0]; 
    n7 [label="**"]; 
    n7 -- n8; 
    n8 [label="4"]; 
    n7 -- n9; 
    n9 [label="5"]; 
} 

sortie:

graphviz output

Dans les cas plus complexes où les nœuds invisibles et les arêtes et la définition des poids devient difficile à gérer, vous pouvez essayer gvpr script Emden R. Gansner à la mise en page des arbres binaires comme décrit dans un answer to this question.

0

Une variation sur @greg's answer, c'est un peu plus compact et moins dépendant de l'ordre des instructions dans le graphique.

Upsides:

  1. Il n'utilise pas du tout rank=same
  2. En général, l'organisation source est un peu plus 'arborescente', ce qui rend les modifications faciles.
  3. Seulement 2 modifications mineures pour afficher/masquer tous les nœuds si nécessaire.
  4. Peu importe l'ordre dans lequel les bords sont déclarés, tant que le parent et les enfants sont tous sur la même ligne.

Inconvénient:

Comme le FAQ, il dépend encore des nœuds cachés pour équilibrer l'arbre.

graph calc { 
    graph[nodesep=0.25, ranksep=0.3, splines=line]; 
    node [fontname = "Bitstream Vera Sans", fontsize=14, 
     style=filled, fillcolor=lightblue, 
     shape=circle, fixedsize=true, width=0.3]; 

    // layout all nodes 1 row at a time 
    // order matters on each line, but not the order of lines 
    "+"; 
    "/", am, "**"; 

    // or can be more spread out if you need to . . . 
    n1 [label="1"]; 
    dm; 
    n2 [label="2"]; 
    "*", bm, "3", "4", cm, "5"; 

    // make 'mid' nodes invisible 
    am, bm, cm, dm [style=dotted, label=""]; 

    // layout all visible edges as parent -> left_child, right_child 
    "+" -- "/","**"; 
    "/" -- "*","3" 
    "**"-- "4","5"; 
    "*" -- n1, n2; 

    // link mid nodes with a larger weight: 
    edge [style=dotted, weight=10]; 
    "+" -- am; 
    "/" -- bm; 
    "**"-- cm; 
    "*" -- dm; 
} 

qui se traduit par:

balanced tree graph

C'est la technique que je l'habitude d'utiliser quand je dois dessiner un arbre.Je n'utilise pas souvent gvpr parce qu'il ne joue pas bien dans les environnements où je veux souvent utiliser un graphique (sphinx, doxygen, etc. Mais si vous pouvez utiliser un pipeline standard pour créer votre graphique et que vous ne vous souciez pas de la source graphique, gvpr est votre ami.