Улучшение макета graphviz
-
21-09-2019 - |
Вопрос
У меня паралич совершенства, когда дело доходит до создания чего-то графического.Если визуальные симметрии не были полностью изучены, мне будет сложнее понять, что происходит.Я также хорошо разбираюсь в визуализации, и мне НРАВИТСЯ упрощать вещи, которые я только что изучил, и рисовать их на бумаге.
Graphviz - хороший инструмент для автоматического рисования, но он мог бы быть лучше.Давайте начнем с примера хорошего графика) скорее конечного автомата).Не обращайте внимания на качество (его можно перерисовать с помощью лучшего инструмента), этот почти идеален, за исключением того, что я бы повернул его против часовой стрелки на 45 градусов, чтобы симметрия была очевидной.Тогда читателю потребуется меньше времени, чтобы понять, насколько состояния q1 и q2 похожи и чем они отличаются.Я утверждаю, что есть единственный наилучший способ представить эту диаграмму, учитывая, что рядом с ней нет других графических элементов.
(источник: gallery.hd.org)
Теперь давайте посмотрим на менее совершенное изображение:
(источник: softpedia.com)
Это похоже на то, что мог бы сгенерировать graphviz.Да, края гладкие, но GAAAAWWWD это ненужная путаница!Это похоже на ментальную карту, а не на законченную диаграмму, готовую к употреблению.Я верю, что человеческие глаза ЖАЖДУТ (не меньше) симметрии.Да, иерархия и так далее.это также важные факторы.
Я удивлен, что нет доступных алгоритмов получше.Некоторые люди вообще не умеют видеть;они могут постигать абстрактные понятия, читая символы.Только не я!
Итак, в чем заключается мой вопрос?Итак, есть ли лучшее бесплатное программное обеспечение для рисования графиков от малого до среднего размера?Возможно
Спасибо!
Дайте мне знать, как я могу улучшить этот пост.
P.S.Мне потребовалось 10 минут, чтобы нарисовать достаточно похожий клон в dia.Это все еще не идеально, но это было удобно сделать, потому что все привязывается к сетке (и я пропустил несколько мелких деталей, но мне не хочется загружать их заново).LR_0 нуждается в "Start --->", идущем сверху, чтобы позволить пользователю быстрее понять начальное состояние.
Решение
После нескольких попыток нарисовать свой график и неудачной попытки получить макет, который вы считаете "лучшим", вы задали вопрос здесь: существует ли "[b] etter бесплатное программное обеспечение [для] рисования графиков от малого до среднего размера". Единственный критерий, который вы указали для оценки алгоритмов компоновки, - это то, насколько близко они подходят к "наилучшему способу представления этой диаграммы". "Наилучший", конечно, оставлен на ваше усмотрение.
Это более или менее то же самое, что пытаться решить проблему, используя данный язык программирования, потерпеть неудачу, а затем запросить лучший язык программирования.
В основе алгоритмов построения графиков лежат процедуры оптимизации, которые генерируют затем оценочные решения ("решение" здесь относится к координатам для каждого узла, которые вместе составляют макет).Эти решения оцениваются в соответствии с минимизацией одного критерия или серии ранжированных критериев, т.е. минимизацией одного или нескольких атрибутов графика, например, общего числа пересекающихся ребер, или суммы расстояний между узлами (или комбинации того и другого, или некоторой взвешенной комбинации этих двух), или близости к симметричной конфигурации.Graphviz состоит из шести различных алгоритмов компоновки (dot neato, fdp, sfdp, twopi и circo).Из них, похоже, вы использовали только точку;однако twopi и circo могли бы быть лучшими вариантами, учитывая их строгие ограничения симметрии, которые, по-видимому, соответствуют вашему собственному представлению о правильно построенном графике.
Во-вторых, текст вашего вопроса направлен на "графики" и рисование графиков, После прочтения вашего полного описания я не думаю, что ваш вопрос имеет какое-либо отношение ни к одной из концепций.
Помимо общих алгоритмов построения графиков (таких как graphviz), существует ряд алгоритмов компоновки, специфичных для конкретной предметной области, например, диаграммы Хассе (для представления частично упорядоченных множеств в теории порядка), графики Барабаши-Альберта (сети без масштабирования) и Эрдоса-Реньи (случайные графики).Каждый из этих алгоритмов создает макет графика на основе критериев и ограничений, предоставляемых доменом - это должно указывать вам на то, что не существует единого "наилучшего" макета во всех доменах.Хотя вы использовали термин "график" в своем вопросе, ваше описание указывает, что ваша проблема связана с рисованием конечных автоматов - весьма своеобразного типа графиков.Общие алгоритмы построения графиков часто плохо справляются с построением специализированных графиков такого рода, потому что алгоритм ничего не знает о предметной области.На самом деле, я не знаю ни о каком алгоритме компоновки для диаграмм состояний - точно так же, как его нет для блок-схем (не то же самое, но похожее).С точки зрения рабочего процесса вы можете нарисовать график в graphviz, а затем импортировать его в Omnigraffle для точной настройки - в Omnigraffle у вас будет детальный контроль над размещением узлов и ребер.
Другие советы
Есть несколько вариантов, о которых я знаю:
- Prefuse - У них есть более старая версия Java.Последняя версия доступна на Flash и имеет несколько приятных макетов.Это называется Предварительная Вспышка.Тот Самый демонстрационная страница иллюстрирует некоторые из его возможностей компоновки.
- JUNG включает в себя ряд опций компоновки, а также мощные функции анализа графиков.Вот несколько примеров здесь.
- Networkx также включает в себя множество возможностей верстки.Некоторые из них перечислены ниже здесь.
Некоторые программы позволяют пользователям настраивать алгоритмы компоновки в режиме реального времени, перемещая узлы с помощью мыши.Этот подход может очень помочь вам при работе с большими графиками.
Я в основном знаю Гефи (отказ от ответственности:Я разработчик).
ТикЗ генерирует красивые макеты графиков.Вы можете использовать макет вручную, который позволяет указать минимум подсказок, или запросить автоматический макет.Значения по умолчанию хороши, и существуют крючки, позволяющие довести их до совершенства.
При полуручном макете вам не придется описывать каждую деталь, поскольку вы можете
- объявляйте узлы как находящиеся «над», «ниже справа» и т. д.относительно других узлов.
- поместите узлы на растр, введя их в виде матрицы:очень удобно, если вы хотите оставить некоторые позиции пустыми.
- легко указать, в каком направлении края должны входить, выходить, сгибаться или поворачивать за углы
Для автоматической раскладки TikZ's graphdrawing
в библиотеке есть некоторые довольно хитрые алгоритмы.
Вот пример ручного макета и кода TeX, использованного для его получения:
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\usepackage[latin1]{inputenc}
\begin{document}
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
semithick]
\tikzstyle{every state}=[fill=red,draw=none,text=white]
\node[initial,state] (A) {$q_a$};
\node[state] (B) [above right of=A] {$q_b$};
\node[state] (D) [below right of=A] {$q_d$};
\node[state] (C) [below right of=B] {$q_c$};
\node[state] (E) [below of=D] {$q_e$};
\path (A) edge node {0,1,L} (B)
edge node {1,1,R} (C)
(B) edge [loop above] node {1,1,L} (B)
edge node {0,1,L} (C)
(C) edge node {0,1,L} (D)
edge [bend left] node {1,0,R} (E)
(D) edge [loop below] node {1,1,R} (D)
edge node {0,1,R} (A)
(E) edge [bend left] node {1,0,R} (A);
\end{tikzpicture}
\end{document}