2010-02-17 22 views
18

Mam paraliż doskonałości, jeśli chodzi o tworzenie czegoś graficznego. Jeśli symetrie wizualne nie zostały w pełni zbadane, mam trudniejsze zrozumienie tego, co się dzieje. Jestem również bardzo wrażliwym wzrokiem i uwielbiam upraszczać rzeczy, których się właśnie nauczyłem i narysować je na papierze.Poprawianie układu graficznego

Graphviz to ładne narzędzie do rysowania rzeczy automatycznie, ale może być lepiej. Zacznijmy od przykładu dobrego wykresu), a raczej maszyny stanu. Mniejsza o jakość (można ją przerysować za pomocą lepszego narzędzia) ta jest prawie idealna, poza tym, że obrócę ją o 45 stopni w lewo, aby uzyskać symetrię. Powinno to skrócić czas oczekiwania czytelnika, aby dowiedzieć się, jak stany q1 i q2 są podobne i jak się różnią. Twierdzę, że istnieje jeden najlepszy sposób przedstawienia tego diagramu, biorąc pod uwagę, że obok niego nie ma innych elementów graficznych.

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

Teraz spójrzmy na mniej niż doskonałe opisie:

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

To wygląda czegoś Graphviz będzie generować. Tak, krawędzie są gładkie, ale GAAAAWWWD to niepotrzebne zamieszanie! Wygląda jak mapa myśli, a nie gotowy diagram gotowy do konsumpcji. Wierzę, że ludzkie oczy CRAVE (nie mniej) symetrii. Tak, hierarchia itp. Są również ważnymi czynnikami.

Jestem zaskoczony, że nie ma lepszych algorytmów dostępnych. Niektórzy ludzie wcale nie są wizualnymi uczniami; potrafią uchwycić abstrakcyjne pojęcia czytając symbole. Nie ja!

Jakie jest moje pytanie? Czy jest dostępne lepsze darmowe oprogramowanie do rysowania małych i średnich wykresów? Być może

Dziękujemy!

Daj mi znać, jak mogę poprawić ten post.

P.S. Wziąłem 10 minut, aby wylosować podobny klon w średnicy. Nadal nie jest doskonały, ale wygodnie było go wykonać, ponieważ wszystko jest przyciągane do siatki (i brakowało mi trochę szczegółów, ale nie mam ochoty na ponowne przesłanie). LR_0 potrzebuje "Start --->" pochodzącego z góry, aby pozwolić użytkownikowi szybciej uchwycić stan początkowy.

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

+3

można zdefiniować, co „piękno” jest pod względem kodu? Jesteś zaskoczony, że nie ma lepszych algorytmów, ale "lepsze" nie jest dokładnie zdefiniowane, jeśli chodzi o tworzenie dowolnych wykresów :) Wydaje się, że pragniesz symetrii, ale przyznajesz, że inni mogą preferować podkreślanie hierarchii, gładkie krawędzie , itp. –

+0

Grahpviz ma wiele opcji, aby zmienić układ, linie, itp. (choć prawie nie można zrozumieć z jego dokumentacji, jak działa). Możesz np. spróbuj dodać 'rankdir = LR;' do wykresu, aby zmienić układ – nos

+0

Na pierwszym wykresie 'LR_2' łączy się również z' LR_5' z 'SS (a)', podczas gdy na drugim wykresie łączy się z innym węzłem o nazwie 'LR_2'. LR_2' z 'S (A)'. – MERose

Odpowiedz

21

Po kilku próbach rysowania wykresu i braku uzyskać układ, który uznają za „najlepszy”, to postawione pytanie tutaj: tam jest „[b] etter wolne oprogramowanie [za] rysunek małych i - wykresy medialne." Jedynym kryterium dałeś do oceny algorytmów układu jest to, jak ściśle pochodzą one z«[s] Ingle najlepszym sposobem reprezentowania schemat.»«Best»oczywiście, w lewo, aby podjąć decyzję.

Jest to mniej więcej to samo, co próba rozwiązania problemu z użyciem danego języka programowania, awaria, a następnie prośba o lepszy język programowania:

Podstawą algorytmów rysowania wykresów są procedury optymalizacyjne, które generują rozwiązania ewaluacyjne ("Rozwiązanie" odnosi się tutaj do współrzędnych każdego węzła, które razem stanowią układ) .Te rozwiązania są oceniane zgodnie z minimalizacją pojedynczego kryterium lub szeregu kryteriów rankingowych - tj. minimalizacja jednego lub więcej atr ibuty na wykresie - na przykład całkowita liczba krawędzi, które przecinają się, lub suma odległości między węzłami (lub kombinacja obu, lub niektóre kombinacje ważone tych dwóch) lub bliskość konfiguracji symetrycznej. Graphviz składa się z sześciu różnych algorytmów układu (dot neato, fdp, sfdp, twopi i circo). Spośród nich wydaje się, że użyłeś tylko kropki; jednak, twopi i circo mogły być lepszymi opcjami, zważywszy na ich ścisłe ograniczenia symetrii, które wydają się pasować do twojego pomysłu na poprawnie narysowany wykres.

Po drugie, tekst pytania jest kierowany do "wykresów" i rysunków graficznych. Po przeczytaniu pełnego opisu nie sądzę, aby twoje pytanie miało związek z żadną z tych koncepcji.

Oprócz ogólnych algorytmów rysowania wykresów (takich jak graphviz), istnieje szereg algorytmów rozmieszczenia specyficznych dla danej domeny, na przykład diagramy Hasse (do reprezentacji częściowo uporządkowanych zbiorów w teorii porządku), wykresy Barabasi-Alberta (bez skali) sieci) oraz Erdos-Renyi (wykresy losowe). Każdy z tych algorytmów tworzy układ graficzny oparty na kryteriach i ograniczeniach dostarczanych przez domenę - powinno to wskazywać, że nie ma jednego "najlepszego" układu we wszystkich domenach. Mimo że w pytaniu użyłeś terminu "wykres", Twój opis wskazuje, że twój problem dotyczy maszyn stanu rysunku - bardzo charakterystyczny typ wykresu. Ogólne algorytmy rysowania wykresów są często słabe przy rysowaniu specjalistycznych wykresów tego rodzaju, ponieważ algorytm nie wie nic o domenie. W rzeczywistości nie jestem świadomy żadnego algorytmu układu dla diagramów stanu - tak jak nie ma jednego dla schematów przepływu (nie ten sam, ale podobny). Przepływ pracy, możesz narysować wykres w graphviz, a następnie zaimportować go do Omnigraffle w celu dokładnego dostrojenia - w Omnigraffle będziesz miał precyzyjną kontrolę nad położeniem węzłów i krawędzi.

3

Istnieje wiele opcji znam:

  • Prefuse - Mają older Java version. Najnowsza wersja jest w wersji Flash i ma ładne układy. Nazywa się Prefuse Flare. The demo page ilustruje niektóre z jego możliwości układu.
  • JUNG zawiera wiele opcji układu, a także potężne funkcje analizy wykresów. Istnieje kilka przykładów: here.
  • Networkx zawiera również wiele możliwości układu. Niektóre z nich są wymienione na here.
+1

Układy NetworkX w większości zależą od Graphviz. – gotgenes

3

Niektóre oprogramowanie pozwala użytkownikom zmieniać układy algorytmów w czasie rzeczywistym, tak długo, jak przesuwają węzły za pomocą myszy. Takie podejście może znacznie pomóc w przypadku większych wykresów.

Znam głównie Gephi (disclamer: jestem dev).

1

TikZ generuje beautiful graph layouts. Możesz użyć układu ręcznego, który pozwala określić minimum podpowiedzi lub poprosić o automatyczny układ. Domyślne wartości są dobre, a haki istnieją, aby dostosować je do perfekcji.

Z semi-ręczny układ nie trzeba zadeklarować każdy szczegół, ponieważ można

  • DECLARE węzły jako „góry”, „poniżej prawa” itp w stosunku do innych węzłów .
  • Umieść swoje węzły na rastrze, wprowadzając je jako matrycę: bardzo wygodne, jeśli chcesz zostawić niektóre pozycje puste.
  • łatwo określić, w jakim kierunku krawędzi powinno wejść, wyjść, zakręt, albo wziąć narożniki

Dla automatycznego układu, graphdrawing biblioteka TikZ zawiera pewne pretty slick algorithms.

Oto przykład ręcznego układu i kodu TeX wykorzystywane do jej uzyskania:

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}