2010-02-17 3 views
18

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

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

http://gallery.hd.org/_exhibits/maths/math-finite-state-machine-DHD.gif http://gallery.hd.org/_exhibits/maths/math-finite-state-machine-DHD.gif

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

http://linux.softpedia.com/screenshots/Graphviz_1.png http://linux.softpedia.com/screenshots/Graphviz_1.png

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

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

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

Спасибо!

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

P.S. Я потратил 10 минут, чтобы вытащить аналогичный достаточно клон в диаметре. Это все еще не идеально, но это было удобно сделать, потому что все привязано к сетке (и я пропустил несколько небольших деталей, но не хотел повторно загружать). Для LR_0 требуется «Старт ->», исходящий сверху, чтобы пользователь быстрее понял начальное состояние.

Finate State Machine http://i47.tinypic.com/315e6w6.png

+3

Можете ли вы определить, что «красота» в терминах кода? Вы удивлены тем, что там нет лучших алгоритмов, но «лучше» не совсем точно определено, когда речь заходит о создании произвольных графиков :) Кажется, вы жаждете симметрии, но вы признаете, что другие могут предпочесть подчеркнуть иерархию, гладкие грани и т. д. –

+0

У grahpviz есть много вариантов, чтобы изменить макет, линии и т. д. (хотя почти невозможно понять из документации, как все работает). Вы можете, например, попробуйте добавить 'rankdir = LR;' в график для изменения макета – nos

+0

В первом графике 'LR_2' также подключается к' LR_5' с 'SS (a)', а во втором графе он соединяется с другим узлом, называемым ' LR_2' с 'S (A)'. – MERose

ответ

21

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

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

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

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

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

3

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

  • Prefuse - У них есть older Java version. Самая новая версия находится в Flash и имеет несколько хороших макетов. Его называют Prefuse Flare. demo page иллюстрирует некоторые возможности его компоновки.
  • JUNG включает в себя ряд вариантов компоновки, а также его мощные функции анализа графиков. Есть несколько примеров: here.
  • Networkx также включает в себя многочисленные возможности компоновки. Некоторые из них перечислены here.
+1

Раскладки NetworkX в основном зависят от Graphviz. – gotgenes

3

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

Я знакомлюсь: Gephi (disclamer: Я дева).

1

TikZbeautiful graph layouts. Вы можете использовать макет руководства, который позволяет указать минимальное количество подсказок или запросить автоматическую компоновку. Значения по умолчанию хороши, и существуют крючки для улучшения до совершенства.

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

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

Для автоматической компоновки, graphdrawing библиотеки TikZ имеет некоторые pretty slick algorithms.

Вот пример ручного макета и кода 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}