Dans le DOT
langage pour GraphViz
, j'essaye de représenter un diagramme de dépendance. J'ai besoin de pouvoir avoir des nœuds à l'intérieur d'un conteneur et de pouvoir rendre les nœuds et / ou conteneurs dépendants d'autres nœuds et / ou conteneurs.
J'utilise subgraph
pour représenter mes conteneurs. La liaison de nœuds fonctionne très bien, mais je ne peux pas comprendre comment connecter des sous-graphiques.
Compte tenu du programme ci-dessous, je dois être capable de me connecter cluster_1
et cluster_2
avec une flèche, mais tout ce que j'ai essayé crée de nouveaux nœuds au lieu de connecter les clusters:
digraph G {
graph [fontsize=10 fontname="Verdana"];
node [shape=record fontsize=10 fontname="Verdana"];
subgraph cluster_0 {
node [style=filled];
"Item 1" "Item 2";
label = "Container A";
color=blue;
}
subgraph cluster_1 {
node [style=filled];
"Item 3" "Item 4";
label = "Container B";
color=blue;
}
subgraph cluster_2 {
node [style=filled];
"Item 5" "Item 6";
label = "Container C";
color=blue;
}
// Renders fine
"Item 1" -> "Item 2";
"Item 2" -> "Item 3";
// Both of these create new nodes
cluster_1 -> cluster_2;
"Container A" -> "Container C";
}
fdp
. L'exemple lié et celui ci-dessus fonctionnent tous les deux (la dernière ligne de l'exemple ici doit utiliser les noms de sous-graphe et non l'étiquette et il peut être intéressant d'inclure des longueurs de ligne pour le graphe); c'est un peu serré tel quel).fdp
v2.28.0 et en copiant / collant la source de l'exemple, les lignes se connectent au centre du sous-graphe, pas aux bords. Si vous ouvrez le .dot dans OmniGraffle, ils sont correctement connectés, tandisneato
que lesdot
deux créent des nœuds superflus pour le cluster.Réponses:
Le manuel de l'utilisateur du DOT donne l'exemple suivant d'un graphe avec des clusters avec des arêtes entre les clusters:
... et les arêtes entre les nœuds et les clusters:
la source
DUMMY_0 [shape=point style=invis]
Pour faciliter la référence, la solution décrite dans la réponse de HighPerformanceMark, appliquée directement à la question d'origine, ressemble à ceci:
Le contenu de
compound=true
lagraph
déclaration est vital. Cela produit une sortie:Notez que j'ai changé les arêtes en nœuds de référence dans le cluster, ajouté les attributs ltail et lhead à chaque arête, en spécifiant le nom du cluster, et ajouté l'attribut de niveau graphique «composé = vrai».
En ce qui concerne le souci que l'on puisse vouloir connecter un cluster sans nœuds à l'intérieur, ma solution a été de toujours ajouter un nœud à chaque cluster, rendu avec style = texte en clair. Utilisez ce nœud pour étiqueter le cluster (au lieu de l'attribut intégré "label" du cluster, qui doit être défini sur la chaîne vide (en Python,
label='""'
). Cela signifie que je n'ajoute plus d'arêtes qui connectent directement les clusters, mais cela fonctionne dans ma situation particulière.la source
cluster_0 -> cluster_1
présent au fur et à mesure de votre sortie. Parce qu'il peut y avoir de nombreux éléments dans cluster_0 lien vers d'autres éléments dans cluster_1 (plusieurs à plusieurs ou un à plusieurs). Ce serait bien d'en lier deux.Assurez-vous que vous utilisez la
fdp
mise en page pour le fichier. Je ne pense pas qu'ilneato
prenne en charge les clusters.la source
neato
moteur ne prend pas en charge les clusters .. Je ne sais pas si c'est un bogue ou pas ..