2017-06-08 2 views
1

Je suis aux prises avec la visualisation d'arborescence de graphes orientés (réseau distribué dans ce cas). En utilisant graphviz: dot J'ai cet arbre:graphviz: Position aléatoire des nœuds dans l'arborescence hiérarchique avec des chemins alternatifs

digraph G { 
    node[width=0.14, height=0.14]; 
    edge[weight=3, color = "0.000 0.000 0.0"]; 
    1 -> 2; 
    1 -> 3; 
    edge[weight=2, color = "0.000 0.000 0.175"]; 
    2 -> 4; 
    2 -> 5; 
    3 -> 6; 
    3 -> 7; 
    edge[weight=1, color = "0.000 0.000 0.825"]; 
    3 -> 4; 
    3 -> 5; 
    2 -> 6; 
    2 -> 7; 
} 

Entraînant: messy output

Vous pouvez voir que les chemins primaires (arêtes avec des poids plus élevés) sont croisés. Le but est d'avoir les nœuds de chemin préférés aussi proches que possible. Je peux le faire en changeant l'ordre des nœuds au hasard afin que la sortie ressemble à ceci: desired output

Cependant, je ne veux pas penser à l'algorithme de commande que je veux automatiser cela sur des centaines de nœuds.

De la documentation:

Le poids d'un bord fournit une autre façon de garder les bords droit. Le poids d'un bord suggère une mesure de l'importance d'un bord; ainsi, plus le poids est lourd, plus les nœuds doivent être rapprochés. dot fait que les bords avec des poids plus lourds sont dessinés plus courts et plus droits.

Mais ce n'est pas le cas car les nœuds sont dessinés dans un ordre aléatoire. Qu'est-ce que je fais mal?

Répondre

1

Probablement pas la réponse que vous recherchez, mais comme point ne semble pas fonctionner avec des poids de pointe dans ce cas:

Vous pouvez simplement utiliser constraint=false pour les bords GrisClair.

+0

En effet, cela fonctionne. Pas parfait, mais certainement un progrès. Je peux juste classer les bords dupliqués et mettre contrainte = false aux poids les plus bas. Merci beaucoup. –

0

Pourriez-vous vivre avec une solution comme celle-ci, qui place des rangées invisibles et des bords invisibles pour imposer l'ordre de gauche à droite de vos nœuds? Alors qu'il ajoute un peu d'espace blanc à gauche du diagramme, au moins, il résout soigneusement le problème d'ordre aléatoire dans chaque rang, et se prête à être automatisé.

digraph G { 
    node[width=0.14, height=0.14]; 

    { 
    rankdir="TB"; 
    edge [style=invis]; 
    rank1 [style=invis]; 
    rank2 [style=invis]; 
    rank3 [style=invis]; 
    rank1 -> rank2 -> rank3 [style=invis]; 
    } 

    edge[weight=3, color = "0.000 0.000 0.0"]; 
    1 -> 2; 
    1 -> 3; 
    edge[weight=2, color = "0.000 0.000 0.175"]; 
    2 -> 4; 
    2 -> 5; 
    3 -> 6; 
    3 -> 7; 
    { 
    edge [style=invis]; 
    rank=same; 
    rank2 -> 2 -> 3;  
    } 

    edge[weight=1, color = "0.000 0.000 0.825"]; 
    3 -> 4; 
    3 -> 5; 
    2 -> 6; 
    2 -> 7; 
    { 
    rank=same; 
    edge [style=invis]; 
    rank3 -> 4 -> 5 -> 6 -> 7 ; 
    } 
} 
+0

Merci JLH pour cette solution. J'ai arrêté de travailler sur ce projet pour l'instant car j'ai d'autres priorités et il serait difficile de trier des centaines de nœuds dans un schéma. –