En el DOTlenguaje para GraphViz, estoy tratando de 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 subgraphpara representar mis contenedores. La vinculación de nodos funciona bien, pero no puedo entender cómo conectar subgráficos.
Dado el programa a continuación, necesito poder conectarme cluster_1y cluster_2con una flecha, pero todo lo que he intentado crea nuevos nodos en lugar de conectar los grupos:
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";
}


fdp. El ejemplo vinculado y el de arriba funcionan (la última línea del ejemplo aquí necesita usar los nombres de los subgrafos, no la etiqueta, y podría ser bueno incluir longitudes de línea para el gráfico); es un poco apretado como es).fdpv2.28.0 y copiando / pegando la fuente del ejemplo, las líneas se conectan al centro del subgrafo, no a los bordes. Si abre el .dot en OmniGraffle, están conectados correctamente,neatoydotambos crean nodos superfluos para el clúster.Respuestas:
El manual del usuario del DOT ofrece el siguiente ejemplo de un gráfico con grupos con bordes entre grupos:
... y bordes entre nodos y grupos:
fuente
DUMMY_0 [shape=point style=invis]Para facilitar la referencia, la solución descrita en la respuesta de HighPerformanceMark, aplicada directamente a la pregunta original, se ve así:
El
compound=trueen lagraphdeclaración es vital. Eso produce salida:Tenga en cuenta que cambié los bordes a los nodos de referencia dentro del clúster, agregué los atributos ltail y lhead 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 estilo = texto sin formato. Use este nodo para etiquetar el clúster (en lugar del atributo de "etiqueta" incorporado del clúster, que debe establecerse en la cadena vacía (en Python
label='""'). Esto significa que ya no agrego bordes que conectan los clústeres directamente, pero Funciona en mi situación particular.fuente
cluster_0 -> cluster_1presente como salida. Debido a que puede haber muchos elementos en el cluster_0, enlace a otros muchos elementos en el cluster_1 (muchos a muchos o uno a muchos). Sería bueno solo vincular dos.Asegúrese de estar utilizando el
fdpdiseño para el archivo. No creo queneatoadmita grupos.fuente
neatomotor no admite grupos .. No estoy seguro si esto es un error o no ..