2010-10-19 2 views
31

У меня есть график, который я создал в graphviz, но проблема в том, что края перекрываются друг с другом (у меня есть 5-7 узлов в каждой строке), поэтому трудно укажите для каждого узла, которые являются узлами, которые он соединяет.Как предотвратить появление краев в Graphviz, чтобы перекрывать друг друга

Как заставить края не перекрывать друг друга? Попросите их пересечь друг друга в порядке.

ответ

21

Я предполагаю, что у вас есть ориентированный граф, который вы используете с точкой.

Я не думаю, что есть волшебный переключатель, чтобы предотвратить перекрывающиеся края. Graphviz пытается сделать это из коробки.

некоторых предложений, которые могут помочь, в зависимости от графика:

  • края концентраторов (концентрат = TRUE): Объединение нескольких ребер с общей конечной точкой в ​​отдельные края, и имеют частично параллельные ребра разделять части их путь.
  • ports: Края могут иметь свое начало и конечную точку на определенном порту (n, ne, e, se, s, sw, w, nw, w, c, _). В зависимости от граничных портов край меняет свою форму (сплайн).
  • невидимые узлы: могут быть случаи, когда введение невидимых узлов для маршрутизации ребер может иметь желаемый эффект.
+0

Как установить атрибут портов? – dnivog

+0

@dnivog Просто добавив ':', за которым следует порт к идентификатору узла (см. Также https://graphviz.gitlab.io/_pages/doc/info/lang.html), например 'node1: ne -> node2: nw' – marapet

14

Другой подход заключается в добавлении свойства перекрытия к графику. Допустимые свойства - это масштаб (который значительно увеличит размер вывода) или false (что не увеличит размер, но, вероятно, приведет к перекрытию узлов).

overlap = scale; 

Если вы используете перекрытие = ложь, вы можете избавиться от края перекрывается с узлами, добавив атрибут splines=true:

overlap = false; 
splines = true; 

Это замедлит время генерации заметна для больших графов.

+1

Где я могу добавить эти свойства в график? Я вставляю их в тело графа, и это не приводит к изменениям. –

+4

Добавление 'graph [overlap = false, splines = true];' также не помогает с моими перекрывающимися ребрами. –

+3

+1 splines = true; – mnemonic

2

Даже для довольно тривиального графика я вижу graphviz (neato, fdp) для создания перекрытий. Например:

graph G { 
0; 
1; 
2; 
3; 
0--1 ; 
1--2 ; 
2--3 ; 
3--0 ; 
} 

Производит крест в моей версии кода 2.38.0. Из документации http://www.graphviz.org/content/FaqNeatoEdgeCrossings они рекомендуют попробовать разные случайные семена. Например, это сработало для меня:

neato -Gstart=5 file.dot -Tps -o file.ps 
Смежные вопросы