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.
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:
El truco es:
Agregar el atributo minlen para forzar cierta separación, dando más espacio para renderizar sin superposiciones y cruces.
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.
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.
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 encuentroscalexy
ú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
ylabelangle
(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"]
}
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.
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