web-dev-qa-db-ja.com

graphvizのエッジが互いに重なり合わないようにする方法

Graphvizで作成したグラフがありますが、問題はエッジが互いに重なり合っていることです(各行に5〜7個のノードがあります)。

エッジが互いに重ならないようにするにはどうすればよいですか?互いに交差させることは問題ありません。

50

ドットでレイアウトした有向グラフがあると仮定しています。

エッジが重ならないようにする魔法のスイッチはないと思います。 Graphvizは、それをすぐに実行しようとします。

グラフに応じて役立ついくつかの提案:

  • エッジコンセントレータ(concentrate = true):共通のエンドポイントを持つ複数のエッジを単一のエッジにマージし、部分的に平行なエッジがパスの一部を共有するようにします。
  • ports:エッジは、特定のポート(n、ne、e、se、s、sw、w、nw、w、c、_)にオリジンとエンドポイントを持つことができます。 Edgeのポートに応じて、Edgeの形式(スプライン)が変わります。
  • 不可視ノード:エッジをルーティングするために不可視ノードを導入すると、望ましい効果が得られる場合があります。
31
marapet

別のアプローチは、グラフにオーバーラッププロパティを追加することです。許容されるプロパティは、scale(出力のサイズが大幅に増加します)またはfalse(サイズはそれほど増加しませんが、エッジがノードとオーバーラップする可能性があります)です。

overlap = scale;

Overlay = falseを使用している場合、splines=true:属性を追加することで、ノードとのエッジのオーバーラップを取り除くことができます

overlap = false;
splines = true;

これにより、大きなグラフの生成時間が大幅に遅くなります。

14
Joel Rein

かなり些細なグラフであっても、オーバーラップを生成するためにgraphvizneatofdp)が表示されます。例えば:

graph G {
0;
1;
2;
3;
0--1 ;
1--2 ;
2--3 ;
3--0 ;
}

コードの私のバージョンでクロスを生成します2.38.0documentation から、彼らは異なるランダムシードを試すことを推奨しています。たとえば、これは私のために働いた:

neato -Gstart=5 file.dot -Tps -o file.ps
8
alfC