2011-01-12 53 views
21

Estoy tratando de usar un punto Graphviz (pero estoy dispuesto a usar algo más) para generar un gráfico con una larga "línea principal" de nodos, y muchas ramas pequeñas Me gustaría que la línea principal sea recta de izquierda a derecha, con las ramas pequeñas encima o debajo de ella. Sin embargo, Graphviz "equilibra" las dos ramas, así que termino con un gráfico torcido.Forzar nodos de "línea principal" en una línea recta en Graphviz (o alternativas)

Para ilustrar, aquí es un esbozo similar a lo que actualmente sale:

Current Graph

Y esto es lo que realmente quiero:

Wanted graph

¿Hay alguna manera de forzar o ¿Alienta a Graphviz a generar un gráfico como el segundo? Es posible que pueda utilizar las segundas ramas "ficticias" para hacer un diseño de 3 vías y luego ocultar/eliminar los maniquíes después, pero si hay una opción mejor que sería preferible.

Respuesta

28

Aquí es una solución usando el peso atributo de bordes:

digraph G { 
    rankdir="LR"; 
    node[width=0.15, height=0.15, shape=point]; 
    edge[weight=2, arrowhead=none]; 
    1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8; 
    edge[weight=1]; 
    2 -> 9 -> 10 ; 
    5-> 11 -> 12; 
} 

Resultado:

graphivz

+0

Eso parece ser el truco, pero parece requerir que se dirija el gráfico. El mío se definió como no dirigido, pero no hay una razón particular por la que deba serlo, así que debería funcionar. Gracias. –

+0

No estoy seguro de si esto sería posible como un gráfico no dirigido, pero me alegro de que esto funcione para usted. – marapet

+2

La mejor manera de crear un gráfico no dirigido es usar un gráfico dirigido pero establecer 'edge [dir =" none "]'. Otra opción es 'dir =" back "', que usa la dirección '->' para el diseño del gráfico, pero dibuja la flecha que apunta en la dirección opuesta. –

28

Una segunda solución usando el grupo atributo de nodos - de nuevo una dirigida gráfico:

De th e referencia dot graphviz:

Si los puntos extremos de un borde pertenecen a la mismo grupo, es decir, tienen el mismo atributo grupo, los parámetros se fijan para cruces Evita mantener los bordes recta .

Así que aquí vamos:

digraph g{ 
    rankdir="LR"; 
    node[width=0.15, height=0.15, shape=point, group=main]; 
    edge[arrowhead=none]; 
    1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8; 
    node[group=branches]; 
    2 -> 9 -> 10; 
    5 -> 11 -> 12; 
} 

de salida es exactamente el mismo que en mi primera respuesta.

+0

Gracias, le agradezco que haya dado una solución alternativa, a pesar de que ya había aceptado la otra. Todavía soy bastante nuevo en Graphviz, así que es bueno ver las posibles maneras de lograr cosas como esta. –

Cuestiones relacionadas