Graphviz genera un desastre

Estoy tratando de visualizar los siguientes datos en formato de puntos 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 quepa en A4 y que ninguno de los bordes se superponga o cruce un nodo. Esto es posible (matemáticamente) porque lo hice yo mismo con un bolígrafo.

preguntado el 03 de mayo de 12 a las 21:05

Intenta usar fdp en lugar de neato; lleva más tiempo, pero produce mejores resultados (más espaciados). Sin embargo, algunos bordes aún pueden superponerse a los nodos. -

3 Respuestas

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

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

    ... esto afecta el espacio entre los bucles en un solo nodo o los múltiples bordes entre un par de nodos.

  • no creo borde peso cambia algo si lo cambias por todos los bordes.
  • Habilitación splines suele ser una buena idea.
  • Se puede agregar espacio adicional alrededor de los nodos 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 ajuste fino de las posiciones de las etiquetas mediante el uso de una combinación de headlabel/taillabel, labeldistance y labelangle (rojo en el ejemplo a continuación para que se destaquen).

Aquí está la muestra modificada:

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

contestado el 03 de mayo de 12 a las 22:05

Jugué con él un par de veces 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:

gráfico

El truco es:

  1. Para agregar el atributo minlen para forzar cierta separación, brindando más espacio para renderizar sin superposiciones ni cruces.

  2. Para invertir la lógica de algunos bordes (hacer que no se inviertan con dir=atrás). De esta forma, dot siempre ve un gráfico acíclico y puede ordenar los bordes sin confundirse.

  3. Centrándose primero en algunos subgráficos y agrupando sus nodos en grupos para brindarles cierta "protección" contra la interferencia al representar el resto del gráfico.

Respondido 13 Jul 12, 20:07

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

salida del motor de puntos

contestado el 23 de mayo de 12 a las 03:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.