Graphviz produce un desastre


Estoy tratando de visualizar los siguientes datos en formato de punto usando GraphViz:

digraph n {
node [nodesep=2.0, fontsize=11];
graph [ overlap=false];
edge[weight=0.2];
A -> B [label="I/5"]
A -> A [label="*/0"]
A -> C [label="ii/2"]
A -> H [label="vii/1"]
B -> D [label="iii/1"]
B -> E [label="IV/2"]
B -> F [label="V/2"]
B -> B [label="vi/2"]
C -> F [label="V/2"]
C -> H [label="vii/1"]
D -> E [label="IV/2"]
E -> D [label="iii/2"]
E -> G [label="iv/1"]
E -> F [label="V/3"]
F -> B [label="I/4"]
F -> B [label="vi/1"]
F -> B [label="*/0"]
G -> B [label="I/5"]
H -> B [label="vi/1"]
}

Ejecutando el siguiente comando: neato -Tpng Chord_NFA.dot > Chord_NFA.png

Me da esta salida:

Me gustaría que encajara en A4 y que ninguno de los bordes se superponga o cruce sobre un nodo. Esto es posible (matemáticamente) porque lo hice yo mismo con un biro.

 28
Author: Rory, 2012-05-04

3 answers

Jugué con él unos cuantos y obtuve esto:

digraph n {
  node [nodesep=2.0, fontsize=11];
  graph [overlap = false];
  subgraph cluster_a {
    style=invisible;
    A; B; H;
  }
  subgraph cluster_b {
    style=invisible;
    D; E; G;
  }
  subgraph cluster_c {
    style=invisible;
    C; F;
  }
  A -> B [label="I/5"];
  A -> A [label="*/0"];
  A -> C [label="ii/2"];
  A -> H [label="vii/1"];
  B:w -> D [label="iii/1"];
  B:nw -> E [minlen=3 label="IV/2"];
  B -> F [minlen=2 label="V/2"];
  B -> B [label="vi/2"];
  C -> F [minlen=2 label="V/2"];
  C -> H [label="vii/1"];
  D -> E [label="IV/2"];
  D -> E [minlen=2 dir=back label="iii/2"];
  G -> E [minlen=2 dir=back label="iv/1"];
  F -> E [dir=back label="V/3"];
  B -> F [minlen=2 dir=back label="I/4"];
  B -> F [minlen=2 dir=back label="vi/1"];
  B -> F [minlen=2 dir=back label="*/0"];
  B -> G [dir=back label="I/5"];
  H -> B [label="vi/1"];
}

Compilar con:

dot -Tpng -o Chord_NFA.png Chord_NFA.gv

La salida es esta, sin cruces de línea:

grafica

El truco es:

  1. Agregar el atributo minlen para forzar cierta separación, dando más espacio para renderizar sin superposiciones y cruces.

  2. Para invertir la lógica de algunas aristas (mostrándolas sin convertir con dir = back). De esta manera, dot siempre ve un gráfico acíclico y puede ordenar los bordes sin confundirse.

  3. Enfocando en algunos subgrafos primero y agrupando sus nodos en clústeres para darles cierta "protección" de interferencia al representar el resto del gráfico.

 24
Author: Victor Stafusa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-13 19:02:06

Aquí hay algunos pasos en una mejor dirección:

  • nodesep no es un atributo de nodo y probablemente no hace lo que esperabas. Pero todavía es útil en su caso:

    ... esto afecta el espaciado entre bucles en un solo nodo o en varios nodos entre un par de nodos.

  • No creo que edge weight cambie algo si lo cambias por all aristas.
  • Habilitación splines a menudo es una buena idea.
  • Añadir espacio adicional alrededor de los nodos se puede hacer con sep
  • overlap tiene más valores que verdadero / falso-A menudo encuentro scalexy útil.
  • Una vez que la distribución de nodos está bien, puede ajustar las posiciones de las etiquetas utilizando una combinación de headlabel/taillabel, labeldistance y labelangle (rojo en el ejemplo de abajo para que se destaquen).

Aquí está el modificado muestra:

digraph n {
splines=true;
sep="+25,25";
overlap=scalexy;
nodesep=0.6;
node [fontsize=11];
//edge[weight=0.2];

A -> B [label="I/5"]
A -> A [label="*/0"]
A -> C [label="ii/2"]
A -> H [label="vii/1"]
B -> D [label="iii/1"]
B -> E [label="IV/2"]
B -> F [headlabel="V/2", labeldistance=4, labelangle=-10, labelfontcolor=red]
B -> B [label="vi/2"]
C -> F [label="V/2"]
C -> H [label="vii/1"]
D -> E [label="IV/2"]
E -> D [label="iii/2"]
E -> G [label="iv/1"]
E -> F [headlabel="V/3", labeldistance=8, labelangle=-7, labelfontcolor=red]
F -> B [label="I/4"]
F -> B [label="vi/1"]
F -> B [label="*/0"]
G -> B [taillabel="I/5", labeldistance=4, labelangle=15, labelfontcolor=red]
H -> B [label="vi/1"]
}

salida graphviz

 37
Author: marapet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-03 21:58:31

Usando el motor dot obtuve la siguiente salida sin cambiar el archivo dot que debería caber en A4. La interpretación de Marapet hace un mejor uso del espacio.

salida del motor dot

 8
Author: ob1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-23 02:21:12