Graphviz(ドット)を使用して、以下に示すグラフを生成しています。左下隅のノード(赤い楕円)は、そのエッジが隣接するノードのいくつかのエッジと交差するため、不快感を引き起こします。ノードの配置を特定の領域に制限する方法はありますか?
個々のノードの配置を制御する手段を知りません。それを行うには、最終的なグラフがどのようになるかを知る必要がありますが、1つのノードを手動で配置すると、残りのグラフのレンダリング方法が変わるため、実際には意味がありません。
.dot
ファイルでノードを定義する順序を変更し、グラフレベルでnodesep
およびranksep
属性を調整することで、この問題を解決しました。それは洗練のプロセスです-それが正しく見えるまで一度にいくつかのことを微調整します。
グラフをSVG
としてレンダリングし、それをVisio(または別のエディター)にインポートして、満足できないノードを手動で再配置することもできます。
目に見えない制約を作成して、他のすべてのノードの左側に赤いノードを表示できます。
redNode -> leftmostNode [style=invis];
前:
後:
@Jannis、これに対する答えにまだ興味がある場合、isは実際に個々のノードの配置を制御する方法です-「pos "属性:
http://www.graphviz.org/doc/info/attrs.html#d:pos
この例として、次のように書くことができます。
n [pos="3,5!"];
これにより、ノードn
が正確に(3,5)
。
ただし、これはレイアウトエンジン「fdp」および「neato」でのみ機能します。
@smokris '[style=invis]
レイアウトに影響するが表示されないエッジを追加することにより、graphvizがそれらを必要な場所に配置するよう説得するためのトリック。
もう1つのトリックは constraint
属性 です。これにより、表示されているがレイアウトには影響しないエッジを追加できます。
新しいエッジを追加するとグラフが混乱する場合は、[constraint=false]
そのエッジ:graphvizはノードを配置するときにそれを無視するようになりました。 ????
false
の場合、ノードのランク付けにEdgeは使用されません。たとえば、グラフでdigraph G { a -> c; a -> b; b -> c [constraint=false]; }
はしっこ
b -> c
は、ランクの割り当て中に制約を追加しません。そのため、唯一の制約は、aがbおよびcを上回り、グラフを生成することです。