Cómo controlar la colocación de nodos en graphviz (es decir, evitar cruces de bordes)


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 colocación de nodos a un área determinada?

Gracias por tus ideas

gráfico con borde que cruza varios otros bordes

Author: jnns, 2010-03-19

4 answers

No tengo conocimiento de ningún medio por el cual controlar la colocación de nodos individuales. Realmente no tiene sentido, porque para hacer eso necesitas saber cómo se verá el gráfico final, sin embargo, colocar un nodo manualmente cambiaría la forma en que se renderiza 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 atributos nodesep y ranksep a nivel de gráfico. Es un proceso de refinamiento-retoques un par de cosas a la vez hasta que se vea bien.

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

 9
Author: Winston Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-19 11:11:20

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

redNode -> leftmostNode [style=invis];

Antes:

antes

Después de:

despues

 38
Author: smokris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-11 16:19:02

@Jannis, en caso de que todavía esté interesado en una respuesta a esto, es en realidad una forma de controlar la colocación de nodos individuales - se utiliza el atributo "pos":

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

Como ejemplo de esto, podrías escribir:

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

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

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

 22
Author: Stuart Golodetz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-25 05:50:59

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


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

Si agregar una nueva arista estropea su gráfico, establezca [constraint=false] en esa arista: ahora graphviz la ignorará al colocar nodos.

Si 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 estar por encima de b y c, produciendo el gráfico:

 7
Author: tjvr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-10 17:43:10