Альтернатива Graphviz с лучшим автоматическим размещением узлов для больших графиков?

Раньше я использовал Graphviz для рисования графиков. Это хороший инструмент для небольших графиков.

Но, к сожалению, для больших графиков Graphviz действительно отстой:

  • Он всегда пересекал ребра, которые, очевидно, могли быть нарисованы без креста.
  • Он накладывает разные тексты, делая их нечитаемыми.
  • В нем нет стилей многократного использования (как в CSS), и вам нужно повторять одни и те же персонализации в узлах и краях снова, снова и снова.
  • Если пользователь хочет, просто скажем, поменять местами два узла. Для этого часто приходится сильно взламывать исходный файл, возможно, прикручивая в процессе несвязанные части графа.
  • Очень просто, чтобы внести небольшие изменения в одном изолированном месте графика, Graphviz вносит серьезные серьезные изменения в другое место, часто сводя на нет часы работы, пытаясь убедить его в том, что он нарисовал его правильно.
  • Он тратит много места на графике и в то же время переполняет некоторые места очень плотно.
  • Иногда некоторые ребра образуют очень извилистые пути для соединения исходного узла с целевым узлом, показывая странные бесполезные кривые и множество наложенных друг на друга боковых ребер.
  • Обладает лавинным эффектом. Тривиальные модификации где-нибудь на графике могут нарушить эвристику Graphviz, что приведет к совершенно другому графику.
  • Много багов...

Я хочу что-то, что как пользователь я могу просто:

  • Определите, что представляют собой узлы, возможно, с применяемым стилем.
  • Скажите, какие края, возможно, со стилем, который нужно применить.

И тогда программа выдает:

  • Граф с минимально возможным числом пересечений.
  • Довольно выровненные узлы — это хорошо.

Я не хочу:

  • Добавьте много взломов на входе только потому, что инструмент слишком глуп, чтобы понять, что он может поменять местами два конкретных узла, чтобы удалить пересечение.
  • Вручную необходимо расположить ребра и узлы.
  • Получите эффекты лавины.

Итак, что может быть хорошей заменой Graphviz? Я очень хочу, чтобы это было бесплатно.

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

Посмотрите, ребята, вот как вы задаете вопрос здесь (и я собираюсь пропустить graphviz really sucksрекламу, потому что вы хорошо объясняете, почему это «отстой»).
Коллега говорит, что d3.js (большую часть) правильно позиционирует. Очевидно, что у него есть и другие не очень приятные побочные эффекты, такие как работа в браузере и динамичность (т. е. не все получают одинаковый результат), так что это может быть не то, что вам нужно.
До того, как я использовал Graphvis, я генерировал графики в Perl с помощью Graph::Easy (и с Graph). search.cpan.org/~tels/Graph-Easy/lib/Graph/Easy.pm Я бы не рекомендовал Graph или Graph::Easy. Я перешел от них к тому, чтобы моя программа на Perl выдавала точечный файл в виде строки и выполняла над ним graphvis.
Согласно дополнительной информации от сотрудника, graphviz довольно хорош (да, мы знаем, насколько плохим может быть вывод, но проблема совершенно нетривиальна) для общего случая. Если вы можете сделать определенные предположения (например, без циклов), есть лучшие алгоритмы, но graphviz, кажется, тоже их объединяет (немного поиграйте с его вариантами). Вам нужна кластеризация, и она становится доступной только тогда, когда вы можете использовать предположения о входных данных.
@mirabilos Поверьте, я уже много вариантов перепробовал (с 2011 года). Если бы в графе не было цикла, он выродился бы в какое-то дерево, и его было бы легко нарисовать. Однако мой график на самом деле имеет много циклов и около 200 узлов. Чтобы справиться с этим с помощью graphviz, мне пришлось разбить граф на 12 независимых подграфов, повторяя узлы, которые появляются более чем в одном графе. Далее мне нужно было добавить множество невидимых узлов, ребер и кластеров. На моих графиках кластеры имеют мало или вообще не имеют семантического значения, они просто хаки, чтобы попытаться заставить graphviz выполнять свою работу правильно.
@Oxinabox, да, это грустно. Но учитывая огромное количество хаков в эвристике, тегах и структуре графвиза, я думаю, что перезапуск с нуля был бы куда лучше, чем форк.
У Computational Science SE есть тот же вопрос: scicomp.stackexchange.com/questions/3315/… . Помимо GraphViz, доступно несколько вариантов: Бесплатно * JavaScript InfoVis Toolkit * Пакет igraph для статистической системы R * zGrViewer * Большая библиотека графиков Небесплатно * GraphInsight
Это не соответствует потребностям ОП, потому что это слишком ручной процесс, но для некоторых пользователей Купидон — правильный способ продолжить.
Можете ли вы опубликовать (или дать ссылку) образец графика, который вы хотели бы выложить?
@Sebastian Ну, я уже ушел из компании, где у нас была эта проблема. Но у меня могут быть данные в каком-то резервном файле где-то.
Если вы это сделаете, пожалуйста, не публикуйте это здесь, чтобы избежать юридических проблем. У вас не должно быть никаких данных, принадлежащих компании, которую вы покинули.

Ответы (5)

Извините за разочарование. Graphviz мог бы быть лучше во многих отношениях, но на данный момент перспективы для этого не велики, потому что AT&T не поддерживает работу так сильно, как это было в прошлом, и некоторые авторы (такие как я) ушли в поисках других. Работа. Мы ищем людей, которые хотят взять его на себя, так что дайте нам знать.

Мы также впечатлены yFiles .

Также попробуйте Tom Sawyer Software ; у них много инженерных талантов, и они много работали над передовыми методами компоновки и интерактивными инструментами. (Возможно, вам придется потратить $$$, так как бесплатная пробная версия, похоже, прекращена.)

В вопросе не говорилось, какой конкретный инструмент или параметры компоновки были опробованы или насколько велика «большая» сеть, поэтому неясно, что предложить.

Если «большой» означает, возможно, сотни узлов, попробуйте neato -Goverlap=false(чтобы избежать перекрытия текстовых меток узлов) и, возможно -Gmodel=subset, попытайтесь улучшить кластеризацию. (Эти параметры не установлены по умолчанию, потому что при анализе данных, например, в биоинформатике, прямое встраивание MDS дает более точное представление расстояний в базовой сети.)

Если «большой» означает тысячи узлов, возможно, многие тысячи, используйте sfdpвместо neatoснова с -Goverlap=false. (Модель расстояния подмножества недоступна в sfdp, потому что неясно, как обрабатывать ребра переменной длины при объединении ребер в иерархическом решателе.) Хороший пример графа с 1054 узлами можно увидеть здесь .

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

Это предложения. Что касается отговорок и объяснений...

То, что кто-то называет «лавинным эффектом», также называют нестабильностью макета по отношению к (незначительным) изменениям во входном графе. Это свойство почти всех программ компоновки пакетных графов и решателей ограничений. Таким образом, вам следует искать интерактивные инструменты, такие как компоновка весеннего встраивания D3, и Тим Двайер проделал большую работу над этим, когда работал в Microsoft, так что, возможно, когда-нибудь их инструментарий Graph Layout (AGL) примет его методы интерактивных ограничений. Просто наблюдение: большинство исследователей и программистов не пытались атаковать масштаб, интерактивность и эстетику одновременно (выберите любые 2 из вышеперечисленных...)

Проблема со стилем также хороша, у нас просто не было времени/энергии, чтобы решить ее, поскольку большинство графиков генерируются автоматически, поэтому вы можете применять стили в каком-либо инструменте предварительной обработки или скрипте. Также необходимо учитывать, что граф представляет собой не просто статическое дерево разбора, но после чтения графа его таблица стилей или атрибуты объектов, к которым были применены стили, могут быть изменены, после чего граф должен быть записан правильно таким образом, чтобы максимально сохранить первоначальную структуру. Не непреодолимые, но это детали, которые необходимо тщательно продумать.

Об ошибках можно сообщать на сайте www.graphviz.org в разделе «Отслеживание ошибок и проблем».

Глобальная трассировка кромок с плавными изгибами — сложная задача. Обратите внимание, что во многих классно выглядящих макетах некоторых других инструментов используются изогнутые края, но они просто рисуют поверх всего, что мешает. Думаю, мы добавили эту функцию и в graphviz. Также я думаю, что был документ CHI или INFOVIS, показывающий, что такие изогнутые края на самом деле немного сложнее правильно читать, чем прямые линии.

Пересечения - возможна некоторая локальная оптимизация. Не уверен, какой инструмент используется. Легко указать на конкретные примеры, где макеты могли бы быть лучше, но сложнее придумать эффективное решение, при котором «минимальное количество пересечений» на самом деле не ухудшило бы ситуацию в целом.

Обратите внимание, что я напрямую связан с Graphviz.

Я проголосовал. Стивен Норт — общепризнанный эксперт в области визуализации графов, и, учитывая то, как OP наносит Graphviz, очень важно получить его понимание в качестве ответа. (Хотя я понимаю разочарование ОП, но построение графиков - сложная проблема)

Я рекомендую программное обеспечение " yEd " - бесплатное приложение для рисования графиков общего назначения, которое очень старается решить проблемы, с которыми вы сталкиваетесь. Насколько мне известно, это программное обеспечение использует лучшие свободно доступные реализации алгоритмов компоновки.

Теперь к более подробному ответу, который больше подходит для StackOverflow, чем для «Рекомендации по программному обеспечению»:

Проблема, которую вы пытаетесь решить, является действительно сложной задачей (особенно в смысле вычислительной сложности ), поэтому маловероятно, что вы найдете инструмент, который одинаково хорошо решит все ваши проблемы. Существует ряд бесплатных решений (GraphViz, вероятно, является одним из лучших) и довольно много коммерческих конкурентов. Для коммерческой библиотеки рисования графиков yFiles доступно бесплатное (как в пиве) кроссплатформенное приложение, которое вы можете попробовать. Он может импортировать данные из нескольких различных форматов, применять сопоставления стилей к вашим данным и предлагает огромную коллекцию различных алгоритмов компоновки. Он называется yEd и может быть запущен без установки в веб-версии отсюда .. Настольную версию можно было запустить как java-приложение «webstart» непосредственно из браузера или после установки одной из автономных программ для Windows, Linux и Mac.

Некоторые из алгоритмов компоновки, вероятно, не следует использовать с очень большими графами (десятки тысяч элементов), потому что они будут выполняться очень долго или потребуют слишком много памяти, но в большинстве случаев существует по крайней мере один стиль компоновки, который должны хорошо соответствовать вашим данным. Если вам нужно запрограммировать API, вам нужно будет лицензировать базовую библиотеку (доступную для Java, .net, Javascript), что противоречит вашему «бесплатному» требованию, но это даст вам еще больше контроля над макетом.

Отказ от ответственности : я работаю в компании, которая создает этот (бесплатный) продукт, однако на Stack Exchange я не представляю своего работодателя. Я тратил большую часть своего академического и профессионального времени на программное обеспечение для построения графиков с конца 1990-х годов, и я считаю, что у меня очень глубокие знания о рынке и доступном программном обеспечении (как бесплатном, так и коммерческом). Могут быть доступны и другие инструменты, и я надеюсь, что этот сайт может найти отличные альтернативы — я, конечно, не буду их отрицать.

+1. ОП-запрос невозможен (программа выдает граф с минимально возможным количеством пересечений, для большого графа --> NP-тяжело, так что удачи). Этот ответ экспертного качества.
Я тоже проголосовал. Если когда-либо и требовалось участие экспертов, так это решение сложных проблем, и особенно приятно слышать мнение экспертов, когда речь идет о приобретении программного обеспечения.
Чтобы преобразовать GraphViz( .dot) в формат, который может прочитать yEd, используйте dottoxml .
Как независимый пользователь yEd (не связанный с компанией) я подтверждаю, что yEd — лучшее из доступных бесплатных программ (и я пробовал многие)

Чтобы очень конкретно ответить на запрос вопроса, поскольку два других ответа отлично поработали над расширением:

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

Однако определение числа пересечений графа является NP-сложной задачей (Гэри и Джонсон показали , что она NP-полна в 1983 году).

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

Может быть «достаточно малое» количество пересечений, а не строго глобальный минимум.

Это, безусловно, будет считаться «решением на основе GraphViz», но если вы работаете с GraphViz, вы можете проверить Gephi . Это гораздо более способно, когда дело доходит до обработки больших графиков.

PlantUML — это инструмент с открытым исходным кодом, позволяющий пользователям создавать диаграммы UML из обычного текстового языка. Язык PlantUML является примером специального языка приложений. Он использует программное обеспечение Graphviz для построения диаграмм. Он использовался, чтобы слепые студенты могли работать с UML. PlantUML также помогает слепым инженерам-программистам проектировать и читать диаграммы UML.

введите описание изображения здесь

Извините, но это совсем не полезно. Автор явно просит программное обеспечение, которое решает проблемы лучше, чем это делает GraphViz. Так что это, очевидно, исключает решения на основе GraphViz. И диаграммы UML, безусловно, не являются типичными приложениями для «больших графов». Вы хотели ответить на другой вопрос?