web-dev-qa-db-ja.com

Graphvizは混乱を出力します

GraphVizを使用して、次のデータをドット形式で視覚化しようとしています。

digraph n {
  node [nodesep=2.0, fontsize=11];
  graph [ overlap=false];
  Edge[weight=0.2];
  A -> B [label="I/5"]
  A -> A [label="*/0"]
  A -> C [label="ii/2"]
  A -> H [label="vii/1"]
  B -> D [label="iii/1"]
  B -> E [label="IV/2"]
  B -> F [label="V/2"]
  B -> B [label="vi/2"]
  C -> F [label="V/2"]
  C -> H [label="vii/1"]
  D -> E [label="IV/2"]
  E -> D [label="iii/2"]
  E -> G [label="iv/1"]
  E -> F [label="V/3"]
  F -> B [label="I/4"]
  F -> B [label="vi/1"]
  F -> B [label="*/0"]
  G -> B [label="I/5"]
  H -> B [label="vi/1"]
}

次のコマンドを実行します:neato -Tpng Chord_NFA.dot > Chord_NFA.png

私にこの出力を与えます:

A4にフィットし、どのエッジもノードとオーバーラップまたは交差しないようにしたいと思います。これは(数学的には)私が自分でビロでやったので可能です。

30
Rory

私はそれをいくつか遊んで、これを得ました:

digraph n {
  node [nodesep=2.0, fontsize=11];
  graph [overlap = false];
  subgraph cluster_a {
    style=invisible;
    A; B; H;
  }
  subgraph cluster_b {
    style=invisible;
    D; E; G;
  }
  subgraph cluster_c {
    style=invisible;
    C; F;
  }
  A -> B [label="I/5"];
  A -> A [label="*/0"];
  A -> C [label="ii/2"];
  A -> H [label="vii/1"];
  B:w -> D [label="iii/1"];
  B:nw -> E [minlen=3 label="IV/2"];
  B -> F [minlen=2 label="V/2"];
  B -> B [label="vi/2"];
  C -> F [minlen=2 label="V/2"];
  C -> H [label="vii/1"];
  D -> E [label="IV/2"];
  D -> E [minlen=2 dir=back label="iii/2"];
  G -> E [minlen=2 dir=back label="iv/1"];
  F -> E [dir=back label="V/3"];
  B -> F [minlen=2 dir=back label="I/4"];
  B -> F [minlen=2 dir=back label="vi/1"];
  B -> F [minlen=2 dir=back label="*/0"];
  B -> G [dir=back label="I/5"];
  H -> B [label="vi/1"];
}

コンパイル:

dot -Tpng -o Chord_NFA.png Chord_NFA.gv

出力はこれで、線の交差はありません。

graph

トリックは:

  1. Minlen属性を追加して分離を強制し、オーバーラップや交差のないレンダリングのためにより多くのスペーシングを提供します。

  2. 一部のエッジのロジックを反転させます(dir = backでそれらを非反転にレンダリングします)。このようにして、ドットは常に非循環グラフを表示し、混乱することなくエッジを並べ替えることができます。

  3. 最初に一部のサブグラフに焦点を合わせ、それらのノードをクラスターにグループ化して、残りのグラフをレンダリングするときに干渉からの「保護」を提供します。

26
Victor Stafusa

より良い方向へのいくつかのステップがあります:

  • nodesep はノード属性ではないため、おそらく期待どおりに動作しません。しかし、それでもあなたの場合には役に立ちます:

    ...これは、単一ノードのループ間の間隔、またはノードのペア間のマルチエッジに影響します。

  • weightallエッジに対して変更した場合、何かが変更されるとは思いません。
  • splines を有効にすることは、しばしば良い考えです。
  • ノードの周囲にスペースを追加するには、 sep を使用します。
  • overlap には、true/falseよりも多くの値があります-scalexyはしばしば便利です。
  • ノードの分散に問題がなければ、headlabel/taillabelの組み合わせを使用してラベル位置を微調整できます。 、labeldistanceおよびlabelangle(下の例では目立つように赤で表示されています)。

変更されたサンプルは次のとおりです。

digraph n {
splines=true;
sep="+25,25";
overlap=scalexy;
nodesep=0.6;
node [fontsize=11];
//Edge[weight=0.2];

A -> B [label="I/5"]
A -> A [label="*/0"]
A -> C [label="ii/2"]
A -> H [label="vii/1"]
B -> D [label="iii/1"]
B -> E [label="IV/2"]
B -> F [headlabel="V/2", labeldistance=4, labelangle=-10, labelfontcolor=red]
B -> B [label="vi/2"]
C -> F [label="V/2"]
C -> H [label="vii/1"]
D -> E [label="IV/2"]
E -> D [label="iii/2"]
E -> G [label="iv/1"]
E -> F [headlabel="V/3", labeldistance=8, labelangle=-7, labelfontcolor=red]
F -> B [label="I/4"]
F -> B [label="vi/1"]
F -> B [label="*/0"]
G -> B [taillabel="I/5", labeldistance=4, labelangle=15, labelfontcolor=red]
H -> B [label="vi/1"]
}

graphviz output

37
marapet

ドットエンジンを使用して、A4に収まるはずのドットファイルを変更せずに次の出力を取得しました。マラペットの演出は、空間をより有効に活用しています。

dot engine output

8
ob1