Por lo que yo sé que esto requiere un poco de trabajo en torno; Solo lo haré en Graphviz DOT language. Primero te doy la solución y luego te doy algunas explicaciones sobre cómo puedes ampliarla.
Esta es la cifra resultante:
Este es el código Graphviz la producción de la figura:
graph atree {
Item1 [shape=none,label="Item 1",pos="2.2,1.1!"];
Item2 [shape=none,label="Item 2",pos="2.2,0.1!"];
Item3 [shape=none,label="Item 3",pos="2.9,-0.3!"];
A [shape=box,color=lightblue,style=filled,pos="2,3!"];
B [shape=box,color=lightblue,style=filled,pos="1,2.1!"];
C [shape=box,color=lightblue,style=filled,pos="3,2.1!"];
D [shape=box,color=lightblue,style=filled,pos="1.5,1.5!"];
E [shape=box,color=lightblue,style=filled,pos="1.5,0.5!"];
D0 [style=invisible,fixedsize=true,width=0,height=0,pos="2,2.5!",label=""];
D1 [style=invisible,fixedsize=true,width=0,height=0,pos="1,2.5!",label=""];
D2 [style=invisible,fixedsize=true,width=0,height=0,pos="3,2.5!",label=""];
D3 [style=invisible,fixedsize=true,width=0,height=0,pos="1,1.5!",label=""];
D4 [style=invisible,fixedsize=true,width=0,height=0,pos="1,0.5!",label=""];
D5 [style=invisible,fixedsize=true,width=0,height=0,pos="1.5,1.1!",label=""];
D6 [style=invisible,fixedsize=true,width=0,height=0,pos="1.5,0.1!",label=""];
D7 [style=invisible,fixedsize=true,width=0,height=0,pos="2.2,-0.3!",label=""];
A -- D0 -- D1 -- B -- D3 -- D4 -- E [color=blue];
E -- D6 -- Item2 -- D7 -- Item3 [color=blue];
D0 -- D2 -- C [color=blue];
D3 -- D -- D5 -- Item1 [color=blue];
}
Si lo pones en un archivo llamado inputfile.dot
que pueda obtener la imagen resultante archivo utilizando el comando neato -Tpng inputfile.dot > outfile.png
.
Ahora un par de comentarios sobre cómo funciona: El código que construye el árbol con A, B, C, D, E, Item1, Item2, Item3
es sencillo (los atributos simplemente establecen los colores y estilos de caja). El truco para hacer que las líneas sean rectas y ortogonales consiste en 1) agregar nodos invisibles con tamaño cero al gráfico, y 2) posicionar todos los objetos en coordenadas absolutas en el lienzo. Los nodos auxiliares D1, D2, D3, D4, D5, D6, D7
son necesarios para el paso 1) y las opciones pos="x,y!"
son necesarias para el paso 2). Tenga en cuenta que necesita el signo !
al final del comando pos
, ya que, de lo contrario, las posiciones no se considerarían definitivas y el diseño podría cambiar.
Puede añadir nodos adicionales por primera posicionamiento un nuevo nodo (utilizando el código para los nodos A ... Item3
como una plantilla), añadiendo una, nodo auxiliar invisible (con pos
de tal manera que todas las conexiones hacia y desde él son ortogonales) y luego agregando la conexión al gráfico a través de <StartingNode> -- <AuxiliaryNode> -- <NewNode>
.
lo que parece que mi código tendrá que hacer la parte difícil de averiguar los números de posicionamiento absoluto! – thomas
Desafortunadamente, no conozco ninguna forma de usar Graphviz que dibuje el gráfico con enlaces ortogonales (y divisiones) entre nodos. Si no requiere este comportamiento, Graphviz hará la mayor parte del trabajo duro por usted. Si insiste en este comportamiento, me temo que tendrá que hacer un trabajo manual para el diseño. – user8472
gracias. Necesito este comportamiento desafortunadamente. tendré que codificar esta lógica. – thomas