Graphviz genera un desastre
Frecuentes
Visto 26,227 veces
35
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.
3 Respuestas
39
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 encuentroscalexy
ú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
ylabelangle
(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"]
}
contestado el 03 de mayo de 12 a las 22:05
29
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:
El truco es:
Para agregar el atributo minlen para forzar cierta separación, brindando más espacio para renderizar sin superposiciones ni cruces.
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.
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
8
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.
contestado el 23 de mayo de 12 a las 03:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas graphviz or haz tu propia pregunta.
Intenta usar
fdp
en lugar deneato
; lleva más tiempo, pero produce mejores resultados (más espaciados). Sin embargo, algunos bordes aún pueden superponerse a los nodos. - Phrogz