web-dev-qa-db-fra.com

Comment contrôler le placement des nœuds dans graphviz (c'est-à-dire éviter les croisements de bords)

J'utilise graphviz (point) pour générer le graphique que vous pouvez voir ci-dessous. Le nœud dans le coin inférieur gauche (ellipse rouge) cause de la gêne car ses bords traversent plusieurs bords du nœud adjacent. Existe-t-il un moyen de restreindre le placement des nœuds dans une certaine zone?

graph with Edge crossing several other edges

43
jnns

Je ne connais aucun moyen de contrôler l'emplacement des nœuds individuels. Cela n'a pas vraiment de sens, car pour ce faire, vous devez savoir à quoi ressemblera le graphique final, mais placer un nœud manuellement changerait alors la façon dont le reste du graphique est rendu.

J'ai résolu ce problème en modifiant l'ordre dans lequel mes nœuds sont définis dans le .dot fichier et peaufiner les attributs nodesep et ranksep au niveau du graphique. C'est un processus de raffinement - peaufiner quelques éléments à la fois jusqu'à ce que cela semble correct.

Vous pouvez également rendre le graphique sous la forme SVG, puis l'importer dans Visio (ou un autre éditeur) et réorganiser manuellement les nœuds dont vous n'êtes pas satisfait.

8
Winston Smith

Vous pouvez créer une contrainte invisible pour faire apparaître le nœud rouge à gauche de tous les autres nœuds.

redNode -> leftmostNode [style=invis];

Avant:

before

Après:

after

47
smokris

@Jannis, au cas où vous seriez toujours intéressé par une réponse à cela, il y a en fait un moyen de contrôler le placement des nœuds individuels - vous utilisez le "pos "attribut:

http://www.graphviz.org/doc/info/attrs.html#d:pos

À titre d'exemple, vous pouvez écrire:

n [pos="3,5!"];

Cela forcerait le noeud n à être précisément (3,5).

Cependant, cela ne fonctionne qu'avec les moteurs de mise en page "fdp" et "neato".

23
Stuart Golodetz

J'aime @smokris '[style=invis] astuce pour persuader graphviz de mettre les choses où vous le souhaitez, en ajoutant des bords qui affectent la mise en page mais ne sont pas visibles.


Une autre astuce est l'attribut constraint , qui vous permet d'ajouter des bords qui sont visibles mais n'affectent pas la disposition.

Si l'ajout d'un nouveau bord gâche votre graphique, définissez [constraint=false] sur cet Edge: maintenant graphviz l'ignorera lors du placement des nœuds. ????

Si false, Edge n'est pas utilisé pour classer les nœuds. Par exemple, dans le graphique

digraph G {
    a -> c;
    a -> b;
    b -> c [constraint=false];  
}

le bord b -> c n'ajoute pas de contrainte lors de l'attribution du rang, donc les seules contraintes sont que a soit au-dessus de b et c, ce qui donne le graphique:

12
tjvr