tutorial mac graphviz dot edge

mac - Cómo controlar la colocación de nodos en graphviz(es decir, evitar los cruces de borde)



graphviz python (4)

Estoy usando graphviz (punto) para generar el gráfico que puedes ver a continuación. El nodo en la esquina inferior izquierda (elipse roja) causa molestia ya que sus bordes cruzan varios bordes del nodo adyacente. ¿Hay alguna manera de restringir la ubicación de los nodos en un área determinada?

Gracias por tus ideas


@Jannis, en caso de que todavía esté interesado en una respuesta a esto, en realidad hay una forma de controlar la ubicación individual de los nodos; usted usa el atributo "pos":

http://www.graphviz.org/doc/info/attrs.html#d:pos

Como ejemplo de esto, puedes escribir:

n [pos="3,5!"];

Eso obligaría al nodo n a estar en precisamente (3,5) .

Sin embargo, esto solo funciona con los motores de diseño "fdp" y "neato".


Me gusta el truco de @smokris [style=invis] para persuadir a graphviz de que coloque las cosas en el lugar que desee, agregando bordes que afectan el diseño pero que no son visibles.

Otro truco es el atributo de constraint , que le permite agregar bordes que son visibles pero que no afectan el diseño.

Si agregar un nuevo borde arruina su gráfico, establezca [constraint=false] en ese borde: ahora graphviz lo ignorará cuando coloque nodos. 🙂

Si es false , el borde no se usa para clasificar los nodos. Por ejemplo, en el gráfico

digraph G { a -> c; a -> b; b -> c [constraint=false]; }

el borde b -> c no agrega una restricción durante la asignación de rango, por lo que las únicas restricciones son que a sea superior a byc, produciendo el gráfico:


No conozco ningún medio por el cual controlar la ubicación de los nodos individuales. En realidad, no tiene sentido, porque para hacer eso necesitarás saber cómo se verá el gráfico final, pero colocar un nodo manualmente cambiaría la forma en que se representa el resto del gráfico.

Resolví este problema cambiando el orden en el que se definen mis nodos en el archivo .dot y ajustando los nodesep y ranksep en el nivel del gráfico. Es un proceso de refinamiento: ajustar algunas cosas a la vez hasta que se vea bien.

También puede representar el gráfico como SVG , luego importarlo en Visio (u otro editor) y reorganizar manualmente los nodos con los que no está satisfecho.


Puede crear una restricción invisible para hacer que el nodo rojo aparezca a la izquierda de todos los otros nodos.

redNode -> leftmostNode [style=invis];

Antes de:

Después: