En el DOT
lenguaje 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 subgraph
para 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_1
y cluster_2
con 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).fdp
v2.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,neato
ydot
ambos 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=true
en lagraph
declaració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_1
presente 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
fdp
diseño para el archivo. No creo queneato
admita grupos.fuente
neato
motor no admite grupos .. No estoy seguro si esto es un error o no ..