tutorial online nodesep fdp tree drawing graphviz

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.