35

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に収まり、どのエッジもノードと重なったり交差したりしないようにしたいと思います。私はビロで自分でやったので、これは(数学的に)可能です。

4

3 に答える 3

39

より良い方向へのいくつかのステップは次のとおりです。

  • nodesepはノード属性ではありません-そしておそらくあなたが期待したことをしません。しかし、それでもあなたの場合には役立ちます:

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

  • すべてのエッジで変更しても、エッジの重みが変わるとは思いません。
  • 多くの場合、スプラインを有効にすることをお勧めします。
  • ノードの周囲にスペースを追加するには、次のコマンドを使用します。sep
  • overlaptrue/falseよりも多くの値があります-私はしばしばscalexy便利だと思います。
  • ノードの分散に問題がなければ、/との組み合わせを使用してラベルの位置を微調整できます(以下の例では赤で目立たせています)。headlabeltaillabellabeldistancelabelangle

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

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出力

于 2012-05-03T21:58:31.403 に答える
29

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

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

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

グラフ

秘訣は次のとおりです。

  1. minlen属性を追加して、ある程度の分離を強制し、オーバーラップや交差なしでレンダリングするための間隔を広げます。

  2. 一部のエッジのロジックを反転します(dir = backを使用してエッジを反転せずにレンダリングします)。このように、ドットは常に非周期的なグラフを認識し、混乱することなくエッジを並べ替えることができます。

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

于 2012-07-13T18:54:52.147 に答える
8

ドットエンジンを使用すると、A4に収まるはずのドットファイルを変更せずに次の出力が得られました。マラペットの演出は、スペースをより有効に活用します。

ドットエンジン出力

于 2012-05-23T02:21:12.973 に答える