2010-02-17 4 views
18

그래픽을 제작할 때 완벽한 마비가 있습니다. 비주얼의 대칭을 완전히 조사하지 못했다면, 나는 무엇이 진행되고 있는지 이해하기가 더 힘들어진다. 저는 매우 시각적 인 학습자이기도하며, 방금 배운 것을 단순화하고 종이에 그리는 것을 좋아합니다.graphviz 레이아웃 개선

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는 불필요한 혼동입니다! 마인드 맵처럼 보입니다. 완성 된 다이어그램은 소비 할 준비가되어 있지 않습니다. 나는 인간의 눈이 덜 대칭 인 것을 믿는다. 예, 계층 구조 등도 중요한 요소입니다.

더 좋은 알고리즘을 사용할 수 없다는 것에 놀랐습니다. 어떤 사람들은 시각적 인 학습자가 아닙니다. 그들은 기호를 읽음으로써 추상적 개념을 파악할 수 있습니다. 나!

내 질문은 무엇입니까? 음, 중소 그래프를 그리는 데 사용할 수있는 무료 소프트웨어가 있습니까? 아마도

고맙습니다!

이 게시물을 개선 할 수있는 방법을 알려주세요.

P. 나는 dia에서 비슷한 정도로 클론을 추출하는데 10 분이 걸렸다. 아직 완벽하지는 않지만 모든 것이 그리드에 맞추기 때문에 편리합니다 (그리고 약간의 세부 사항을 놓쳤지만 다시 업로드하는 느낌은 들지 않습니다). LR_0은 사용자가 시작 상태를 더 빨리 파악할 수 있도록 위의 "Start --->"가 필요합니다.

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

+3

당신이 무엇을 "아름다움"참조 코드의 관점에 정의 할 수 있습니까? 거기에 더 나은 알고리즘이 없다는 사실에 놀랐지 만 임의의 그래프를 만들 때 "더 나은"정의가 정확하지는 않습니다. 대칭을 갈구하는 것처럼 보이지만 다른 사람들이 계층을 강조하고 부드러운 가장자리를 선호하는 것을 인정합니다 등 –

+0

grahpviz에는 레이아웃, 선 등을 변경할 수있는 많은 옵션이 있습니다 (문서에서 어떻게 작동하는지 알 수는 없지만). 예 : 그래프에 'rankdir = LR;'을 추가하여 레이아웃을 변경하십시오. – nos

+0

첫 번째 그래프에서'LR_2 '는'SS (a)'로'LR_5'에 연결되는 반면 두 번째 그래프에서는' LR_2'와'S (A)'를 비교합니다. – MERose

답변

21

, 당신은 여기에 질문을 제기 : 가 작은 드로잉 [에]가 "[B] 에터 무료 소프트웨어입니다 - 중간 그래프.그 다이어그램을 표현하기 위해 [S] 화롯불 가장 좋은 방법 " 당신이 레이아웃 알고리즘을 평가하기위한 준 유일한 기준은 그들이에 와서 얼마나 가깝게이다." "당신이 결정하는"베스트 "물론, 왼쪽.

이것은 특정 프로그래밍 언어를 사용하여 문제를 풀려고 시도하고 실패한 다음 더 나은 프로그래밍 언어를 묻는 것과 거의 같습니다.

그래프 그리기 알고리즘의 핵심은 평가 솔루션을 생성하는 최적화 루틴입니다 여기에서 '솔루션'은 레이아웃을 구성하는 각 노드의 좌표를 의미합니다.) 이러한 솔루션은 하나의 기준 또는 일련의 순위가 매겨진 기준의 최소화 - 즉 하나 이상의 attr의 최소화에 따라 평가됩니다 그래프의 ibutes - 예를 들어 교차하는 엣지의 총 수 또는 노드 간 거리의 합 (또는 둘의 조합 또는이 둘의 가중치 조합) 또는 대칭 구성과의 근접성. Graphviz는 여섯 가지 레이아웃 알고리즘 (dot neato, fdp, sfdp, twopi 및 circo)으로 구성됩니다. 이 중, 당신은 점만 사용하는 것으로 보입니다. 그러나 정확하게 그려진 그래프에 대한 자신 만의 아이디어와 일치하는 것으로 보이는 엄격한 대칭 제약 조건을 고려할 때 두 개 및 일주가 더 나은 옵션 일 수 있습니다.

둘째는, 질문의 텍스트 전체 설명을 읽은 후에 "그래프"와 그래프 그리기 감독, 난 당신의 질문 중 하나를 컨셉으로 아무 상관이 있다고 생각하지 않습니다.

graphviz와 같은 일반적인 그래프 그리기 알고리즘 외에도 Hasse 다이어그램 (순서 이론에서 부분적으로 정렬 된 집합을 나타 내기 위해), Barabasi-Albert 그래프 (scale-free 네트워크), 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을 : 내가 dev에있어) 알고있다.

1

TikZbeautiful graph layouts를 생성한다. 최소 힌트를 지정할 수있는 수동 레이아웃을 사용하거나 자동 레이아웃을 요청할 수 있습니다. 기본값은 양호하며, 훅은 완벽하게 조정될 수 있습니다. 반 수동 레이아웃으로

다른 노드를 기준 등 '의 바로 아래에'할 수 있습니다

  • 선언 노드 때문에 '의 위'로서, 모든 세부 사항을 선언 할 필요가 없습니다 . 매우 편리 당신이 빈 어떤 위치를 마칠 경우 :
  • 매트릭스로를 입력하여 래스터에 노드를 배치합니다.
  • 쉽게 TikZ의 graphdrawing 라이브러리가 어떤 pretty slick algorithms을 가지고, 무엇에 방향 가장자리 모서리
  • 자동 레이아웃에 대한

를 입력, 굽힘을 떠나, 또는해야 지정합니다. 여기

수동 레이아웃과 텍 코드의 예를 얻는 데 사용됩니다 :

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}