graphics - grafos - diametro de un grafo ejemplo
GraphViz-¿Cómo conectar subgrafos? (3)
En el lenguaje DOT
para GraphViz
, intento representar un diagrama de dependencia. Necesito poder tener nodos dentro de un contenedor y poder hacer que los nodos y / o contenedores dependan de otros nodos y / o contenedores.
Estoy usando un subgraph
para representar mis contenedores. La vinculación de nodos funciona bien, pero no entiendo cómo conectar subgrafos.
Dado el siguiente programa, necesito poder conectar cluster_1
y cluster_2
con una flecha, pero todo lo que he intentado crea nuevos nodos en lugar de conectar los 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";
}
Asegúrese de estar utilizando el diseño fdp
para el archivo. No creo que neato
admita clusters.
El manual de usuario de DOT proporciona el siguiente ejemplo de un gráfico con grupos con bordes entre grupos
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;
}
y bordes entre nodos y clusters.
Para facilitar la referencia, la solución descrita en la respuesta de HighPerformanceMark, aplicada directamente a la pregunta original, tiene el siguiente aspecto:
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];
}
El ''compuesto = verdadero'' en la declaración ''gráfico'' es vital. Eso produce salida:
Tenga en cuenta que cambié los bordes a nodos de referencia dentro del clúster, agregué los atributos de cola y cabeza a cada borde, especificando el nombre del clúster y agregué el atributo de nivel de gráfico ''compuesto = verdadero''.
Con respecto a la preocupación de que uno quiera conectar un clúster sin nodos dentro de él, mi solución ha sido siempre agregar un nodo a cada clúster, representado con style = plain texte. Utilice este nodo para etiquetar el clúster (en lugar del atributo "etiqueta" integrado del clúster, que debe establecerse en la cadena vacía (en Python, label=''""''
). Esto significa que ya no agrego bordes que conecta clústeres directamente, pero funciona en mi situación particular.