GraphViz - Comment connecter des sous-graphes?
-
19-09-2019 - |
Question
Dans la langue DOT
pour GraphViz
, je suis en train de représenter un diagramme de dépendance. Je dois être en mesure d'avoir des noeuds dans un conteneur et d'être en mesure de faire des nœuds et / ou des conteneurs dépendant des autres noeuds et / ou des conteneurs.
J'utilise subgraph
pour représenter mes conteneurs. liaison Node fonctionne très bien, mais je ne peux pas comprendre comment connecter des sous-graphes.
Compte tenu du programme ci-dessous, je dois être capable de se 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 relier les pôles:
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";
}
La solution
Le manuel utilisateur DOT donne l'exemple suivant d'un graphe avec les clusters avec des arêtes entre les clusters
digraph G {
compound=true;
subgraph cluster0 {
a -> b;
a -> c;
b -> d;
c -> d;
}
subgraph cluster1 {
e -> g;
e -> f;
}
b -> f [lhead=cluster1];
d -> e;
c -> g [ltail=cluster0,lhead=cluster1];
c -> e [ltail=cluster0];
d -> h;
}
et les bords entre les noeuds et les clusters.
Autres conseils
Pour plus de commodité la solution décrite dans la réponse de HighPerformanceMark, appliquée directement à la question initiale, ressemble à ceci:
digraph G {
graph [fontsize=10 fontname="Verdana" compound=true];
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;
}
// Edges between nodes render fine
"Item 1" -> "Item 2";
"Item 2" -> "Item 3";
// Edges that directly connect one cluster to another
"Item 1" -> "Item 3" [ltail=cluster_0 lhead=cluster_1];
"Item 1" -> "Item 5" [ltail=cluster_0 lhead=cluster_2];
}
Le compound=true
dans la déclaration de graph
est essentiel. Ce produit sortie:
Notez que j'ai changé les bords pour faire référence à des nœuds dans le cluster, a ajouté le ltail et lhead attributs à chaque bord, en spécifiant le nom du cluster, et a ajouté l'attribut niveau graphique « composé = true ».
En ce qui concerne l'inquiétude que l'on pourrait vouloir connecter un cluster sans noeuds à l'intérieur, ma solution a été toujours ajouter un nœud à chaque cluster, rendu avec style = texte brut. Utilisez ce nœud pour étiqueter le cluster (au lieu du du pôle attribut intégré « label », qui doit être réglé sur la chaîne vide (en Python, label='""'
). Cela signifie que je ne suis plus l'ajout d'arêtes qui relient les grappes directement, mais cela fonctionne dans ma situation particulière.
Assurez-vous que vous utilisez la mise en page de fdp
pour le fichier. Je ne pense pas neato
prend en charge les clusters.