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にフィットし、どのエッジもノードとオーバーラップまたは交差しないようにしたいと思います。これは(数学的には)私が自分でビロでやったので可能です。
私はそれをいくつか遊んで、これを得ました:
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
出力はこれで、線の交差はありません。
トリックは:
Minlen属性を追加して分離を強制し、オーバーラップや交差のないレンダリングのためにより多くのスペーシングを提供します。
一部のエッジのロジックを反転させます(dir = backでそれらを非反転にレンダリングします)。このようにして、ドットは常に非循環グラフを表示し、混乱することなくエッジを並べ替えることができます。
最初に一部のサブグラフに焦点を合わせ、それらのノードをクラスターにグループ化して、残りのグラフをレンダリングするときに干渉からの「保護」を提供します。
より良い方向へのいくつかのステップがあります:
nodesep
はノード属性ではないため、おそらく期待どおりに動作しません。しかし、それでもあなたの場合には役に立ちます:...これは、単一ノードのループ間の間隔、またはノードのペア間のマルチエッジに影響します。
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"]
}
ドットエンジンを使用して、A4に収まるはずのドットファイルを変更せずに次の出力を取得しました。マラペットの演出は、空間をより有効に活用しています。