GraphViz - Wie Subgraphen verbinden?
-
19-09-2019 - |
Frage
In der DOT
Sprache für GraphViz
, Ich versuche, ein Abhängigkeitsdiagramm darzustellen. Ich muß in der Lage sein, Knoten in einem Container zu haben und in der Lage zu sein, Knoten zu machen und / oder Container abhängig von anderen Knoten und / oder Containern.
Ich verwende subgraph
meine Container darzustellen. Knoten Verknüpfung funktioniert gut, aber ich kann nicht herausfinden, wie Subgraphen zu verbinden.
das Programm Da unten muß ich in der Lage sein cluster_1
und cluster_2
mit einem Pfeil zu verbinden, aber alles, was ich versucht habe, schafft neue Knoten stattdessen die Cluster verbinden:
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";
}
Lösung
Die DOT Bedienungsanleitung gibt folgendes Beispiel eines Graphen mit Clustern mit Kanten zwischen Clustern
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;
}
und Kanten zwischen den Knoten und Clustern.
Andere Tipps
Zur leichteren Orientierung die Lösung in HighPerformanceMark Antwort beschrieben, direkt auf die ursprüngliche Frage angewendet wird, sieht wie folgt aus:
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];
}
Die compound=true
in der graph
Erklärung ist von entscheidender Bedeutung. Das erzeugt eine Ausgabe:
Beachten Sie, dass die Kanten I geändert Referenzknoten innerhalb des Clusters, hinzugefügt, um die ltail und LHEAD zu jeder Kante Attribut der Clusternamen spezifizieren, und addierte das Graph-Level-Attribut ‚compound = true‘.
In Bezug auf der Sorge, dass man einen Cluster ohne Knoten im Innern verbinden mag, meine Lösung wurde auf immer einen Knoten zu jedem Cluster hinzufügen, mit Stil gerendert = Klartext. Verwenden Sie diesen Knoten des Clusters (anstelle des Clusters eingebauten „Label“ Attribut zu kennzeichnen, die auf die leere Zeichenfolge gesetzt werden soll (in Python, label='""'
). Das bedeutet, ich bin nicht mehr Kanten hinzufügen, die Cluster direkt verbinden, aber es funktioniert in meiner besonderen Situation.
Stellen Sie sicher, fdp
Layout für die Datei verwenden. Ich glaube nicht, neato
unterstützt Cluster.