Jak kontrolować rozmieszczenie węzłów w graphviz (tj. unikać przekroczeń krawędzi)

Używam graphviz (dot) do generowania wykresu, który można zobaczyć poniżej. Węzeł w lewym dolnym rogu (czerwona elipsa) powoduje rozdrażnienie, ponieważ jego krawędzie krzyżują się z kilkoma krawędziami sąsiedniego węzła. Czy istnieje sposób na ograniczenie umiejscowienia węzłów w określonym obszarze?

Dzięki za pomysły

Wykres z krawędzią przekraczającą kilka innych krawędzi

Author: jnns, 2010-03-19

4 answers

Nie wiem, jak kontrolować rozmieszczenie poszczególnych węzłów. To naprawdę nie ma sensu, ponieważ aby to zrobić, musisz wiedzieć, jak będzie wyglądał końcowy Wykres, ale ręczne umieszczenie jednego węzła zmieniłoby sposób, w jaki reszta wykresu jest renderowana.

Rozwiązałem ten problem, zmieniając kolejność, w jakiej moje węzły są zdefiniowane w pliku .dot i poprawiając atrybuty nodesep i ranksep na poziomie wykresu. To proces udoskonalania-poprawiania kilka rzeczy na raz, aż będzie dobrze wyglądać.

Możesz również renderować wykres jako SVG, a następnie zaimportować go do Visio (lub innego edytora) i ręcznie zmienić kolejność węzłów, z których nie jesteś zadowolony.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-19 11:11:20

Możesz utworzyć niewidoczne ograniczenie, aby czerwony węzeł pojawiał się po lewej stronie wszystkich innych węzłów.

redNode -> leftmostNode [style=invis];

Przed:

przed

Po:

po

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-11 16:19:02

@Jannis, jeśli nadal jesteś zainteresowany odpowiedzią na to, tam jest w rzeczywistości sposób na kontrolowanie indywidualnego umieszczania węzłów-używasz atrybutu "pos":

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

Jako przykład możesz napisać:

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

To wymusiłoby, aby node n był dokładnie (3,5).

Jednak działa to tylko z silnikami układu "fdp" i "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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-25 05:50:59

Podoba mi się sztuczka @smokris' [style=invis] za przekonywanie graphviz, aby umieścić rzeczy tam, gdzie chcesz, dodając krawędzie, które wpływają na układ, ale nie są widoczne.


Kolejna sztuczka to constraint atrybut, który pozwala dodać krawędzie, które są widoczne, ale nie wpływają na układ.

Jeśli dodanie nowej krawędzi psuje twój wykres, ustaw [constraint=false] na tej krawędzi: teraz graphviz zignoruje go podczas umieszczania węzłów.

Jeśli false, krawędź nie jest używana w rankingu węzłów. Na przykład, w Wykres

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

Krawędź b -> c nie dodaje ograniczenia podczas przypisywania rangi, więc jedyne ograniczenia są takie, że być powyżej b I c, dając Wykres:

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-10 17:43:10