Как предотвратить наложение ребер в graphviz друг на друга

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

Как сделать так, чтобы края не перекрывали друг друга? Если они пересекаются друг с другом, это нормально.


person David Rabinowitz    schedule 19.10.2010    source источник
comment
Ознакомьтесь с документацией graphviz.gitlab.io/_pages/pdf/neatoguide.pdf. раздел 4. В нем говорится, что невозможно предотвратить перекрытие краев. Это говорит о том, что это область для будущей работы. У меня очень большой график, так что при перекрытии=масштабе получается смехотворно мелкий шрифт, а при перекрытии=ложь он тупо плотный! Я бы хотел, чтобы был способ сделать немного voronoi и немного масштаба, а не или/или.   -  person John Henckel    schedule 18.01.2019
comment
После некоторых экспериментов мне повезло с dot -Granksep=2 -Gnodesep=1 -Grankdir=LR -Gsplines=ortho -Nshape=box. Вы можете увеличить размер блоков и sep и в конечном итоге получить нулевое перекрытие. К сожалению, neoto и twopi не поддерживают nodesep, так что вы застряли с точкой.   -  person John Henckel    schedule 18.01.2019


Ответы (3)


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

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

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

  • концентраторы ребер (concentrate=true): объединяйте несколько ребер с общей конечной точкой в ​​отдельные ребра, чтобы частично параллельные ребра разделяли части своего пути.
  • порты . Ребра могут иметь начало и конечную точку на определенном порту (n, ne, e, se, s, sw, w, nw, w, c, _). В зависимости от портов ребра ребро меняет свою форму (сплайн).
  • невидимые узлы: могут быть случаи, когда добавление невидимых узлов к краям маршрута может дать желаемый эффект.
person marapet    schedule 12.01.2011
comment
Как установить атрибут портов? - person dnivog; 22.02.2018
comment
@dnivog Просто добавив :, за которым следует порт, к идентификатору узла (см. также graphviz.gitlab.io/_pages/doc/info/lang.html ), например node1:ne -> node2:nw - person marapet; 24.02.2018

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

overlap = scale;

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

overlap = false;
splines = true;

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

person Jivlain    schedule 31.10.2011
comment
Где добавить эти свойства на график? Я вставляю их в тело графика, и это не приводит к изменениям. - person Steven Lu; 22.12.2012
comment
Добавление graph [overlap=false, splines=true]; также не помогает с моими перекрывающимися краями. - person Steven Lu; 22.12.2012
comment
overlap не поддерживается движком DOT. - person vertti; 31.10.2013
comment
перекрытие имеет дело только с перекрытием узлов, оно не имеет никакого отношения с перекрытием краев. - person Ingmar Hupp; 18.04.2014
comment
Просто отметим, что их можно указать в консоли следующим образом: neato -Goverlap=false -Gsplines=true -Tpdf inputFile > outputFile - person Anssssss; 03.12.2015
comment
Привет. Как я могу применить его с моим вводом диаграммы? stackoverflow.com/questions/52562208/ - person skan; 03.10.2018
comment
Splines = true действительно убивает производительность, так как это создает в основном кривые, а не прямые линии. - person AdamKalisz; 08.04.2020

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

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

Выдает крестик в моем варианте кода 2.38.0.

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

Например, это сработало для меня:

neato -Gstart=5 file.dot -Tps -o file.ps
person alfC    schedule 06.01.2015
comment
Кажется, ссылка не работает прямо сейчас (2018-05-31). Это работает: graphviz.gitlab.io/faq/#FaqNeatoEdgeCrossings - person Ronie; 31.05.2018
comment
Как я могу установить параметр с моим вводом? stackoverflow.com/questions/52562208/ - person skan; 03.10.2018
comment
@alfC, пожалуйста, перейдите по ссылке, я объясню командную строку и приведу пример. Я использую Neato и Dot, и в обоих случаях некоторые края тривиально пересекаются. - person skan; 03.10.2018
comment
@skan, я нашел, но не нашел командной строки, можешь повторить здесь? - person alfC; 03.10.2018
comment
Я использую Diagrammer от R. И я говорю ему использовать внутри Graphviz для создания графика. Сначала я определяю узлы и ребра, затем определяю некоторые свойства, например, аккуратный макет, и сохраняю все на графике. В конце я использую команду render_graph(graph) - person skan; 03.10.2018
comment
@skan, я не знаком с R. Думаю, если вам удастся передать аргументы командной строки (например, -Gstart=5) в render_graph, тогда все готово. Другой вариант — перейти внутрь командной строки Diagrammer и жесткого кода к чему-то другому. - person alfC; 03.10.2018
comment
@skan, если вам (очень) повезло, возможно, вы можете перехватить аргумент вывода, чтобы передать параметры в командную строку render_graph(graph, "-Gstart=5 file.eps"). - person alfC; 03.10.2018
comment
Спасибо, но это, кажется, ничего не делает. Я сделал скрипт для суммирования данных из большой базы данных и создания из них графиков с использованием разных параметров. Например, я получаю это i.imgur.com/DvdXhFs.jpg. Я намеренно удалил этикетки. Как вы можете видеть, он не может оптимизировать позиционирование. - person skan; 03.10.2018
comment
@skan, я видел в одном из примеров команду set.seed(42), возможно, которая изменяет переменную рандомизации для средства визуализации графа. - person alfC; 03.10.2018