Подтвердить что ты не робот

Как управлять размещением node в graphviz (т.е. Избегать перекрестных пересечений)

Я использую graphviz (точка) для создания графика, который вы можете увидеть ниже. node в левом нижнем углу (красный эллипс) вызывает раздражение, поскольку его края пересекают несколько краев соседнего node. Есть ли способ удержать размещение node в определенной области?

Спасибо за ваши идеи

график с пересечением ребер нескольких других ребер http://i39.tinypic.com/e6od8z.png

4b9b3361

Ответ 1

Я не знаю никаких средств для управления размещением отдельных узлов. Это не имеет смысла, потому что для этого вам нужно будет знать, как будет выглядеть окончательный график, но при этом вручную node вручную изменит способ отображения остальной части графика.

Я решил эту проблему, изменив порядок, в котором мои узлы определены в файле .dot, и настраивая атрибуты nodesep и ranksep на уровне графа. Это процесс уточнения - настройка нескольких вещей за раз, пока он выглядит правильно.

Вы также можете отобразить график как SVG, а затем импортировать его в Visio (или другой редактор) и вручную переупорядочить узлы, которым вы не довольны.

Ответ 2

Вы можете создать невидимое ограничение, чтобы красный node отображался слева от всех остальных узлов.

redNode -> leftmostNode [style=invis];

До:

before

После:

after

Ответ 3

@Jannis, в случае, если вас все еще интересует ответ на этот вопрос, на самом деле есть способ контролировать индивидуальное размещение node - вы используете атрибут pos:

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

В качестве примера вы можете написать:

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

Это заставит node n быть точно (3,5).

Однако это работает только с механизмами компоновки "fdp" и "neato".

Ответ 4

Мне нравится трюк @smokris '[style=invis] для того, чтобы убедить graphviz помещать вещи туда, где вы хотите, добавив края, которые влияют на макет, но не видны.


Другим трюком является constraint атрибут, который позволяет добавлять кромки, видимые, но не влияющие на макет.

Если добавление нового края испортит ваш график, установите [constraint=false] на этом краю: теперь graphviz будет игнорировать его при размещении узлов. 🙂

Если false, ребро не используется для ранжирования узлов. Например, в график

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

край b -> c не добавляет ограничения во время присвоения ранга, поэтому единственными ограничениями являются: быть выше b и c, давая график: