GraphViz – ¿Cómo conectar subgrafos?

En el lenguaje DOT para GraphViz , bash representar un diagtwig 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 sé cómo conectar subgrafos.

Dado el siguiente progtwig, 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"; } 

enter image description here

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.

enter image description here

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 statement ‘gráfico’ es vital. Eso produce salida:

gráfico con clusters conectados

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 text. 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.

Asegúrese de estar utilizando el diseño fdp para el archivo. No creo que neato admita clusters.