2012-07-21 18 views
6

Estoy tratando de visualizar un gráfico simple de máquina de estados finitos utilizando Graphviz. El diseño creado por Graphviz no es completamente de mi agrado. Esperaba un resultado más compacto con bordes más cortos.¿Cómo influir en el diseño de los elementos gráficos?

Hasta ahora, he intentado usar grupos y cambiar los pesos de los bordes, pero no mucha suerte. No me queda claro por qué Graphviz dibuja el gráfico de la forma en que lo hace y cómo ajustar su algoritmo a mi gusto. ¿Hay algún parámetro que pueda establecer para lograr eso? ¿O debería usar otro comando que no sea dot? Probé neato, pero el resultado se veía completamente en mal estado y otra vez, yo no entiendo muy bien lo que estoy haciendo ...

Ésta es mi mejor resultado hasta el momento:

Finite State Machine, best result so far

tratando de visualizar una mejor lay-out que esto, creo que el gráfico se vería mejor si las cajas rojas se alinearon de manera diferente, más compacto, por ejemplo, como se indica por las flechas en esta imagen:

Finite State Machine, imagined better result

que utilizan dot para crear el gráfico y código fuente es el siguiente:

1 digraph JobStateDiagram 
    2 { 
    3 rankdir=LR; 
    4 size="8,5"; 
    5 
    6 node [style="rounded,filled,bold", shape=box, fixedsize=true, width=1.3, fontname="Arial"]; 
    7 Created [fillcolor=black, shape=circle, label="", width=0.25]; 
    8 Destroyed [fillcolor=black, shape=doublecircle, label="", width=0.3]; 
    9 Empty  [fillcolor="#a0ffa0"]; 
10 Announced [fillcolor="#a0ffa0"]; 
11 Assigned [fillcolor="#a0ffa0"]; 
12 Working [fillcolor="#a0ffa0"]; 
13 Ready  [fillcolor="#a0ffa0"]; 
14 TimedOut [fillcolor="#ffa0a0"]; 
15 Failed [fillcolor="#ffa0a0"]; 
16 
17 { 
18  rank=source; Created Destroyed; 
19 } 
20 
21 edge [style=bold, fontname="Arial" weight=2] 
22 Empty  -> Announced [ label="announce" ]; 
23 Announced -> Assigned [ label="assign"  ]; 
24 Assigned -> Working [ label="start"  ]; 
25 Working -> Ready  [ label="finish"  ]; 
26 Ready  -> Empty  [ label="revoke"  ]; 
27 
28 edge [fontname="Arial" color="#aaaaaa" weight=1] 
29 Announced -> TimedOut [ label="timeout" ]; 
30 Assigned -> TimedOut [ label="timeout" ]; 
31 Working -> TimedOut [ label="timeout" ]; 
32 Working -> Failed [ label="error"  ]; 
33 TimedOut -> Announced [ label="announce" ]; 
34 TimedOut -> Empty  [ label="revoke"  ]; 
35 Failed -> Announced [ label="announce" ]; 
36 Failed -> Empty  [ label="revoke"  ]; 
37 
38 edge [style=bold, fontname="Arial" weight=1] 
39 Created -> Empty  [ label="initialize" ]; 
40 Empty  -> Destroyed [ label="finalize" ]; 
41 Announced -> Empty  [ label="revoke"  ]; 
42 Assigned -> Empty  [ label="revoke"  ]; 
43 Working -> Empty  [ label="revoke"  ]; 
44 } 

Además, alguien por favor hágamelo saber si hago cualquier cosas extrañas en el archivo de arriba Graphviz - cualquier comentario es apreciado.


Actualización:

Más experimentar y probar algunas sugerencias como puertos, dados por marapet usuario, han aumentado mi confusión ... Por ejemplo, en la imagen siguiente, ¿por qué dot elegir para dibujar estos extraños desvíos para Working->Failed y Failed->Announced, a diferencia de las líneas más rectas?

Graph with strange long edges

+0

Hay varias herramientas graphviz para el diseño dirigido (dot, twopi, circo, patchwork, osage) ver https://graphviz.gitlab.io/_pages/pdf/dot.1.pdf que valdría la pena intentar. – qneill

Respuesta

9

Para mí su salida se ve bien. TimedOut y Failed son, por supuesto, todo el camino a la derecha porque hay un borde que va desde Working a ellos. Eso es lo que mejor hace dot, y si bien puede hacer algunos ajustes para ajustar los diseños de gráficos, creo que es mejor usar otra herramienta si desea crear un diseño de gráfico en particular y controlar todo.

Dicho esto, lo intenté rápidamente con graphviz. Cambié algunas líneas para crear una línea recta con todos los nodos verdes, y para alinear los nodos rojos como se indica en su pregunta. También he añadido concentradores borde - el resultado no se ve mejor para mí:

digraph JobStateDiagram 
{ 
    rankdir=LR; 
    size="8,5"; 
    concentrate=true; 

    node [style="rounded,filled,bold", shape=box, fixedsize=true, width=1.3, fontname="Arial"]; 
    Created [fillcolor=black, shape=circle, label="", width=0.25]; 
    Destroyed [fillcolor=black, shape=doublecircle, label="", width=0.3]; 
    Empty  [fillcolor="#a0ffa0"]; 
    Failed [fillcolor="#ffa0a0"]; 
    Announced [fillcolor="#a0ffa0"]; 
    Assigned [fillcolor="#a0ffa0"]; 
    Working [fillcolor="#a0ffa0"]; 
    Ready  [fillcolor="#a0ffa0"]; 
    TimedOut [fillcolor="#ffa0a0"]; 

    { 
    rank=source; Created; Destroyed; 
    } 
    { 
    rank=same;Announced;Failed; 
    } 
    { 
    rank=same;Assigned;TimedOut; 
    } 

    edge [style=bold, fontname="Arial", weight=100] 
    Empty  -> Announced [ label="announce" ]; 
    Announced -> Assigned [ label="assign"  ]; 
    Assigned -> Working [ label="start"  ]; 
    Working -> Ready  [ label="finish"  ]; 
    Ready  -> Empty  [ label="revoke", weight=1  ]; 

    edge [color="#aaaaaa", weight=1] 
    Announced -> TimedOut [ label="timeout" ]; 
    Assigned -> TimedOut [ label="timeout" ]; 
    Working -> TimedOut [ label="timeout" ]; 
    Working -> Failed [ label="error"  ]; 
    TimedOut -> Announced [ label="announce" ]; 
    TimedOut -> Empty  [ label="revoke"  ]; 
    Failed -> Announced [ label="announce" ]; 
    Failed -> Empty  [ label="revoke"  ]; 

    Created -> Empty  [ label="initialize" ]; 
    Empty  -> Destroyed [ label="finalize" ]; 
    Announced -> Empty  [ label="revoke"  ]; 
    Assigned -> Empty  [ label="revoke"  ]; 
    Working -> Empty  [ label="revoke"  ]; 
} 

graphviz output

También puede mejorar mediante el uso de los puertos con el fin de controlar dónde empiezan y terminan los bordes.

cuanto a su pregunta sobre las cosas extrañas en su archivo de puntos: A excepción números de línea (que finalmente me permitió poner el modo columna de mi editor de texto para un buen uso) y alinear, el archivo se ve bien a yo.Estructurar mis archivos de puntos de forma similar (propiedades de gráficos, lista de nodos, agrupaciones, bordes) siempre que sea posible. Solo tenga en cuenta que el orden de aparición de los nodos puede tener un impacto en el diseño final.

+0

Gracias por hacer el esfuerzo de probar esto y darme más sugerencias. He actualizado la pregunta con algunos resultados. No creo que esta sea una solución completa todavía, así que esto requerirá un poco más de experimentación de mi parte para lograr lo que estoy buscando. –

Cuestiones relacionadas