質問

私は何かグラフィックなものを制作することになると、完璧に麻痺してしまいます。ビジュアルの対称性が十分に調査されていない場合、何が起こっているのかを理解するのはさらに難しくなります。私は非常に視覚的な学習者でもあり、学んだばかりのことを単純化して紙に描くのが大好きです。

Graphviz は自動的に描画する優れたツールですが、さらに優れたものになる可能性があります。良いグラフの例から始めましょう (むしろステートマシン)。品質は気にしないでください (より良いツールを使用して再描画できます)。対称性を明確にするために反時計回りに 45 度回転することを除けば、これはほぼ完璧です。そうすれば、読者は、状態 q1 と q2 がどのように似ているか、どこがどのように異なるかを理解するのにかかる時間が短縮されるはずです。隣に他のグラフィックが存在しないことを考慮すると、その図を表現する唯一の最良の方法があると私は主張します。

http://gallery.hd.org/_exhibits/maths/math-finite-state-machine-DHD.gif
(ソース: ギャラリー.hd.org)

次に、完璧とは言えない描写を見てみましょう。

http://linux.softpedia.com/screenshots/Graphviz_1.png
(ソース: ソフトペディア.com)

これは、graphviz が生成するもののように見えます。はい、エッジは滑らかですが、GAAAAWWWD これは不必要に混乱を招くものです。これはマインド マップのように見えますが、すぐに使用できる完成した図ではありません。人間の目は(それに劣らず)対称性を求めていると私は信じています。はい、階層などです。も重要な要素です。

これより優れたアルゴリズムがないことに驚いています。まったく視覚的に学習できない人もいます。彼らは記号を読むことで抽象的な概念を理解することができます。私じゃない!

それで、私の質問は何ですか?そうですね、小規模から中規模のグラフを描画するために利用できる、より優れたフリー ソフトウェアはありますか?多分

ありがとう!

この投稿を改善する方法を教えてください。

追伸dia で十分に類似したクローンを作成するのに 10 分かかりました。まだ完璧ではありませんが、すべてがグリッドにスナップされるため、作成するのは便利でした(細かい部分をいくつか見逃しましたが、再アップロードする気はありません)。LR_0 には、ユーザーが開始状態をより早く把握できるように、上からの「Start--->」が必要です。

Finate State Machine

役に立ちましたか?

解決

あなたのグラフを描画し、あなたが「最高」を考えるのレイアウトを取得するために失敗にいくつかの試みの後、あなたはここで質問を提起:の の存在である「[B] Etterのフリーソフトウェア小を描く[用]中にグラフ。その図を表現するために[S]イングルの最良の方法」を使用すると、レイアウトアルゴリズムを評価するために与えてくれた唯一の基準は、彼らがに来てどのように密接です 『』あなたが決定するために、「ベスト」もちろん、左ます。

これは、特定のプログラミング言語を使用して問題を解決しようとすると失敗し、その後、より良いプログラミング言語を尋ねると同じ多かれ少なかれです。

グラフ描画アルゴリズムの中心には、その後、評価ソリューション(ここで「溶液」は一緒にレイアウトを含み、各ノードの座標を意味する)を生成する最適化ルーチンです。これらのソリューションは、単一の基準またはランク付け基準の一連の最小化に基づいて評価されている - すなわち、グラフの1つのまたは複数の属性の最小化 - 例えば、交差エッジの総数、又は距離の和ノード(または両方の組み合わせ、又はこれら二つの一部加重組み合わせ)、または近さの間の対称的な構成です。 Graphvizのは、6つの異なるレイアウトアルゴリズム(ドット格好いい、FDP、sfdp、twopi、およびサーコ)から構成されています。これらのうち、あなただけのドットを使用し表示されます。より良いオプションが正しく描画グラフの独自の考えを一致させるように見える彼らの厳格な対称性の制約を与えられたが、twopiとサーコがされている可能性があります。

第二に、あなたの質問のテキストは、「グラフ」と、グラフ描画に向けられている、あなたの完全な説明を読んだ後、私はあなたの質問がコンセプトのいずれかを行うには何も持っていないと思います。

(Graphvizのような)一般的なグラフ描画アルゴリズムを超えて、ドメイン固有のレイアウトアルゴリズムの数は、例えば、ある、ハッセ図(順理論に順序集合を表現するために)、Barabasiアルバートグラフ(スケールフリーネットワーク)、及びオルドス - レーニイ(ランダムグラフ)。これらのアルゴリズムは、それぞれのドメインから供給される基準および制約に基づいて、グラフのレイアウトを作成する - これは、すべてのドメインにまたがるシングル「最高」のレイアウトがないことをあなたに知らせるべきです。グラフの非常に特異なタイプを - あなたは、あなたの質問に「グラフ」という用語を使用しますが、あなたの説明は、あなたの問題はステートマシンを描画に関連することを示しています。アルゴリズムは、ドメインについて何も知らないので、一般的なグラフ描画アルゴリズムは、この種の専門グラフを描画する時にしばしば乏しいです。 (同じですが、似ていない)のフロー図の1がないだけのように - 実際に、私は状態図のための任意のレイアウトアルゴリズムを認識していませんよ。ワークフローワイズ、あなたは微調整のためにOmniGraffleはそれをインポートしgraphvizのグラフを描くかもしれない - 。OmniGraffleはで、あなたはノードとエッジの配置を細かく制御する必要があります。

他のヒント

私が知っているオプションはいくつかあります。

  • プレフューズ - 彼らは 古いJavaバージョン. 。最新バージョンは Flash であり、いくつかの優れたレイアウトを備えています。それは呼ばれています プレフューズフレア. 。の デモページ は、そのレイアウト機能の一部を示しています。
  • JUNG には、強力なグラフ分析機能に加えて、多数のレイアウト オプションが含まれています。いくつか例があります ここ.
  • Networkx には、多数のレイアウト機能も含まれています。そのうちのいくつかを列挙します ここ.

いくつかのソフトウェアは、ユーザーがマウスでノードを移動する限り、リアルタイムでレイアウトアルゴリズムを微調整しましょう。このアプローチは非常に大きいグラフのためにあなたを助けるかもしれません。

私はほとんど知っている Gephiする(disclamer:私はdevのだ)。

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}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top