simple grafos grafo ejemplo diametro conexo ciclo graphics graphviz dot directed-graph subgraph

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.