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
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.
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:
Po:
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)
.
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 Wykresdigraph 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:
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