Улучшение графического макета - PullRequest
19 голосов
/ 17 февраля 2010

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

Graphviz - хороший инструмент для автоматического рисования, но он может быть и лучше. Начнем с примера хорошего графа) скорее конечный автомат). Не берите в голову качество (это может быть перерисовано с лучшим инструментом), это почти идеально, за исключением того, что я повернул бы его против часовой стрелки на 45 градусов, чтобы сделать симметрию очевидной. Затем читателю потребуется меньше времени, чтобы выяснить, как состояния q1 и q2 похожи и как они отличаются. Я утверждаю, что существует единственный лучший способ представить эту диаграмму, учитывая, что рядом с ней нет других графических элементов.

http://gallery.hd.org/_exhibits/maths/math-finite-state-machine-DHD.gif
(источник: gallery.hd.org )

Теперь давайте посмотрим на не совсем идеальное изображение:

http://linux.softpedia.com/screenshots/Graphviz_1.png
(источник: softpedia.com )

Это похоже на то, что генерирует graphviz. Да, края гладкие, но GAAAAWWWD это не нужно путать! Это похоже на карту разума, а не на готовую диаграмму, готовую к употреблению. Я считаю, что человеческие глаза КРИВЕ (не меньше) симметрии. Да, иерархия и т. Д. Также являются важными факторами.

Я удивлен, что нет лучших алгоритмов. Некоторые люди вообще не являются визуальными учениками; они могут понять абстрактные понятия, читая символы. Не я!

Итак, какой у меня вопрос? Ну, есть ли лучшее бесплатное программное обеспечение для рисования графиков от среднего до среднего? Возможно

Спасибо!

Дайте мне знать, как я могу улучшить этот пост.

P.S. Мне потребовалось 10 минут, чтобы вытащить достаточно похожего клона в диам. Это все еще не идеально, но это было удобно сделать, потому что все привязано к сетке (и я пропустил несколько мелких деталей, но не чувствую необходимости повторной загрузки). LR_0 необходимо, чтобы "Start --->" исходил сверху, чтобы пользователь мог быстрее понять начальное состояние.

Finate State Machine

Ответы [ 4 ]

21 голосов
/ 19 февраля 2010

После нескольких попыток нарисовать ваш график и не получить макет, который вы считаете "лучшим", вы задали вопрос здесь: есть "[b] нет свободного программного обеспечения [для] рисования маленькихна средние графы. " Единственный критерий, который вы дали для оценки алгоритмов компоновки, заключается в том, насколько близко они подходят к" наилучшему способу представления этой диаграммы ".«Лучшее», конечно, оставлено на ваше усмотрение.

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

В основе алгоритмов рисования графа лежат процедуры оптимизации, которые затем генерируют оценочные решения (здесь «решение» относится к координатам для каждого узла, которые вместе составляют макет).Эти решения оцениваются в соответствии с минимизацией одного критерия или ряда ранжированных критериев, т. Е. Минимизацией одного или нескольких атрибутов графа, например, общим количеством пересекающихся ребер или суммой расстояний.между узлами (или комбинацией обоих, или некоторой взвешенной комбинацией этих двух), или близостью к симметричной конфигурации.Graphviz состоит из шести различных алгоритмов компоновки (точка neato, fdp, sfdp, twopi и circo).Из них, кажется, вы использовали только точку;однако twopi и circo, возможно, были бы лучшими вариантами, учитывая их строгие ограничения симметрии, которые, по-видимому, соответствуют вашей собственной идее правильно построенного графа.

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

Помимо общих алгоритмов рисования графиков (таких как graphviz), существует ряд алгоритмов компоновки, зависящих от предметной области.например, диаграммы Хассе (для представления частично упорядоченных множеств в теории порядка), графы Барабаси-Альберта (безмасштабные сети) и Эрдос-Реньи (случайные графы).Каждый из этих алгоритмов создает макет графика на основе критериев и ограничений, предоставленных доменом - это должно указывать на то, что не существует единого «наилучшего» макета во всех доменах.Хотя вы использовали термин «график» в своем вопросе, ваше описание указывает на то, что ваша проблема связана с рисованием конечных автоматов - очень своеобразного типа графика.Общие алгоритмы рисования графиков часто плохо рисуют специализированные графы такого рода, потому что алгоритм ничего не знает о предметной области.На самом деле, я не знаю ни одного алгоритма компоновки для диаграмм состояний - точно так же, как нет алгоритма компоновки (не то же самое, но похожее).С точки зрения рабочего процесса, вы можете нарисовать график в graphviz, а затем импортировать его в Omnigraffle для тонкой настройки - в Omnigraffle вы будете иметь детальный контроль над размещением узлов и ребер.

3 голосов
/ 26 апреля 2012

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

В основном я знаю Gephi (дисклеймер: я - разработчик)

3 голосов
/ 17 февраля 2010

Есть несколько вариантов, о которых я знаю:

  • Prefuse - у них есть более старая версия Java . Самая новая версия находится во Flash и имеет несколько приятных макетов. Его называют Prefuse Flare . Демо-страница иллюстрирует некоторые ее возможности макета.
  • JUNG включает в себя несколько вариантов компоновки, а также мощные функции анализа графиков. Вот несколько примеров здесь .
  • Networkx также включает в себя многочисленные возможности макета. Некоторые из них перечислены здесь .
1 голос
/ 26 октября 2014

TikZ создает красивых макетов графика . Вы можете использовать ручную разметку, которая позволяет указать минимум подсказок, или вы можете запросить автоматическую разметку. Значения по умолчанию хороши, и для достижения совершенства существуют зацепки.

С полуручным макетом вам не нужно декларировать каждую деталь, потому что вы можете

  • объявляет узлы как «выше», «ниже правого» и т. Д. Относительно других узлов.
  • Поместите ваши узлы в растр, введя их в виде матрицы: очень удобно, если вы хотите оставить некоторые позиции пустыми.
  • легко указать, в каком направлении кромки должны входить, выходить, изгибаться или принимать углы

Для автоматического размещения библиотека TikZ graphdrawing имеет несколько довольно гладких алгоритмов .

Вот пример компоновки вручную и код TeX, использованный для его получения:

example graph

\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}
...