2010-06-27 12 views
21

Tengo un gráfico que quiero que graphviz muestre y visualice para mí. El gráfico tiene 122 bordes y 123 nodos. Los bordes son de 4 tipos diferentes y quiero que sean visualmente distinguibles. Sin embargo, aún no he decidido cuál sería la mejor manera de hacerlo, me gustaría jugar un poco con los diales. Lamentablemente, no veo nada como un atributo de "clase" o "hoja de estilo" para los bordes. Solo puedo establecer atributos visuales individualmente para cada borde (mucha repetición). Tal vez me he perdido algo? ¿Hay alguna forma, después de todo, de agregar bordes a 4 grupos diferentes y luego personalizar los grupos, no cada borde individualmente?Graphviz: ¿cómo asignar el mismo estilo a un grupo de bordes?

Respuesta

30

a Estilo bordes (o nodos) por grupo en lugar de individualmente, utilice subgrafo.

así:

digraph G { 

node [style=filled,color="#5D8AA8", fillcolor="#5D8AA8"]; 

subgraph c1 { 
    edge [color="#004225", arrowsize="0.6", penwidth="1"]; 
    "node 1" -> "node 3"; 
    "node 5" -> "node 7"; 
    "node 1" -> "node 2"; 
    label = ""; 
} 

subgraph c2 { 
    edge [color="#FBEC5D", arrowsize="1.2", penwidth="3"]; 
    "node 2" -> "node 4"; 
    "node 4" -> "node 6"; 
    "node 3" -> "node 5"; 
    "node 6" -> "node 8"; 
    label = ""; 

} 

begin -> "node 1"; 
start -> "node 2"; 
"node 1" -> "node 4" 
"node 2" -> "node 6"; 

start [shape=diamond];} 

Así que si pones el código anterior en un archivo w/una extensión ".dot"; luego renderízalo en graphviz ,, verás tres diferentes tipos de bordes, en apariencia.

Un tipo es simplemente el predeterminado (color = negro, grosor = 1, etc.) - es decir, estos bordes no están asignados a un subgrafo.

Los otros dos tipos de bordes (un grupo delgado de color verde oscuro y un grupo grueso de color amarillo brillante) se diseñan según la asignación a uno de los dos subgrupos.

subgrafo se utiliza a menudo para visualmente destacado un grupo de nodos (es decir, para distinguir un 'grupo' contigua particular de los nodos del resto de los nodos en el gráfico); sin embargo, no hay ningún requisito (como se puede ver en mi ejemplo) de que los bordes que elijas estilizar por asignación a un subgráfico dado, pertenezcan a un "grupo" de nodos contiguos: puedes designar los bordes que desees para su asignación a una determinada sub-gráfico.)

a mí, nodos de estilo por grupo es análogo a la práctica HTML de definir una clase y asignarlo a una colección de divs en el formato HTML

+0

¿Cómo podemos definir el estilo por defecto para subgrafos? – Pacerier

+1

No hay necesidad de subgrafos. Todos los bordes definidos debajo de una declaración de estilo de borde con "borde [color = ... etc]" usarán ese estilo. – Bousch

12

Mientras @ respuesta de Doug es correcta (subgrafos utilizar para asignar estilo similar a los grupos de objetos), creo que mi ejemplo es mejor:

digraph G {                  
    compound=true; 
    subgraph columns { 
    c0r0 -> c0r1; 
    c0r1 -> c0r2; 
    c1r0 -> c1r1; 
    c1r1 -> c1r2; 
    c2r0 -> c2r1; 
    c2r1 -> c2r2; 
    } 
    subgraph rows { 
    edge [color=red, constraint=false]; 
    c0r0 -> c1r0; 
    c1r0 -> c2r0; 
    c0r1 -> c1r1; 
    c1r1 -> c2r1; 
    c0r2 -> c1r2; 
    c1r2 -> c2r2; 
    } 
} 


cat square-digraph.dot | dot -Tsvg -o square-digraph.svg 

the resulting graph

+1

Perfecto, simplemente perfecto. – Pacerier

+1

¿Por qué es mejor? No es para criticarte. No conozco la gráfica lo suficiente como para entender cómo es mejor y estoy interesado en averiguarlo. –

+0

Simplemente me gusta el diagrama resultante. El principio de la solución no es diferente. – bukzor

Cuestiones relacionadas