tree - online - graphviz tutorial
Hacer que los árboles graphviz tengan a los padres centrados sobre los niños (2)
Tengo el siguiente código graphviz:
graph {
node[width = 0.6, height = 0.6, fixedsize=true, shape=circle];
a[label="22"];
b[label="22"];
c[label="34"];
d[label="22"];
e[label="99"];
f[label="34"];
g[label="40"];
h[label="37"];
i[label="22"];
j[label="99"];
k[label="135"];
l[label="129"];
m[label="40"];
edge[penwidth=3.0];
a -- b;
b -- d;
c -- f;
d -- i;
e -- j;
g -- m;
edge[penwidth=1.0];
a -- c;
b -- e;
c -- g;
d -- h;
e -- k;
g -- l;
}
Esto es para dibujar un árbol binario con algunos bordes resaltados. Sin embargo, el árbol no se ve del todo bien, especialmente en el árbol, la disposición de padres e hijos se ve así:
parent
child child
mientras que me gustaría que se vea más como esto:
parent
child child
(es decir, que el padre esté centrado sobre sus hijos, no sobre uno de ellos). ¿Es esto posible, y cómo lo haría si es así?
Jugué mucho y creo que no hay una solución perfecta. Hay algunos enfoques.
El enfoque clásico con bordes y nodos invisibles adicionales. Esto funciona para gráficos pequeños, pero se vuelve muy feo en los grandes. para asegurarse de que esto funcione, debe llenar la cuadrícula completa con nodos invisibles. de lo contrario, el motor de puntos lo anulará.
lo que esperaba resolver era este enfoque
digraph {
edge [weight=1]
0->L
0->R
edge [weight=10]
L->LL
L->LR
R->RL
R->RR
edge [weight=100]
LL->LLL
LL->LLR
LR->LRL
LR->LRR
RL->RLL
RL->RLR
RR->RRL
RR->RRR
}
Lamentablemente no fue así. Parece que el motor de diseño de puntos intenta minimizar no la longitud del borde, pero la parte horizontal solo es decir, cualquier posición principal entre los nodos secundarios se considera ideal.
Otro que probé es
digraph {
splines=line
style=dotted
edge [weight=1]
subgraph cluster_0 {
subgraph cluster_L {
subgraph cluster_LL {
LLL
LLM [style=dotted]
LLR
LL->LLL
LL->LLM [style=dotted weight=100]
LL->LLR
}
LM [style=dotted]
subgraph cluster_LR {
LRL
LRM [style=dotted]
LRR
LR->LRL
LR->LRM [style=dotted weight=100]
LR->LRR
}
L->LL
L->LM [style=dotted weight=100]
L->LR
}
M [style=dotted]
subgraph cluster_R {
subgraph cluster_RL {
RLL
RLM [style=dotted]
RLR
RL->RLL
RL->RLM [style=dotted weight=100]
RL->RLR
}
RM [style=dotted]
R->RL
R->RM [style=dotted weight=100]
R->RR
}
0->L
0->M [style=dotted weight=100]
0->R
}
}
lo que da
Parece que funciona, el orden horizontal depende de la apariencia. Pero los clusters no se comportan bien con muchos otros constructos, tienes que probar si te funciona.
Si omite los clusters, el diseño será horizontalmente más compacto. los bordes verticales aún son prevenidos por los nodos intermedios invisibles.
digraph {
splines=line
style=dotted
edge [weight=1]
LLL
LLM [style=dotted]
LLR
LL->LLL
LL->LLM [style=dotted weight=100]
LL->LLR
LM [style=dotted]
LRL
LRM [style=dotted]
LRR
LR->LRL
LR->LRM [style=dotted weight=100]
LR->LRR
L->LL
L->LM [style=dotted weight=100]
L->LR
M [style=dotted]
RLL
RLM [style=dotted]
RLR
RL->RLL
RL->RLM [style=dotted weight=100]
RL->RLR
RM [style=dotted]
R->RL
R->RM [style=dotted weight=100]
R->RR
0->L
0->M [style=dotted weight=100]
0->R
}
lo que da
Finalmente, queda una cosa, un script gvpr para el diseño de árbol por ERG. Los detalles que encuentras en marapets responden a esta pregunta .
Siguiendo las instrucciones en esta respuesta vinculada usando gvpr y el guión de Emden R. Gansner para mapear genéticamente árboles binarios, obtengo el siguiente resultado:
No se puede pensar en una manera mejor o más rápida.