web-dev-qa-db-ja.com

graphvizでノードの配置を制御する方法(つまり、エッジの交差を回避する)

Graphviz(ドット)を使用して、以下に示すグラフを生成しています。左下隅のノード(赤い楕円)は、そのエッジが隣接するノードのいくつかのエッジと交差するため、不快感を引き起こします。ノードの配置を特定の領域に制限する方法はありますか?

graph with Edge crossing several other edges

43
jnns

個々のノードの配置を制御する手段を知りません。それを行うには、最終的なグラフがどのようになるかを知る必要がありますが、1つのノードを手動で配置すると、残りのグラフのレンダリング方法が変わるため、実際には意味がありません。

.dotファイルでノードを定義する順序を変更し、グラフレベルでnodesepおよびranksep属性を調整することで、この問題を解決しました。それは洗練のプロセスです-それが正しく見えるまで一度にいくつかのことを微調整します。

グラフをSVGとしてレンダリングし、それをVisio(または別のエディター)にインポートして、満足できないノードを手動で再配置することもできます。

8
Winston Smith

目に見えない制約を作成して、他のすべてのノードの左側に赤いノードを表示できます。

redNode -> leftmostNode [style=invis];

前:

before

後:

after

47
smokris

@Jannis、これに対する答えにまだ興味がある場合、isは実際に個々のノードの配置を制御する方法です-「pos "属性:

http://www.graphviz.org/doc/info/attrs.html#d:pos

この例として、次のように書くことができます。

n [pos="3,5!"];

これにより、ノードnが正確に(3,5)

ただし、これはレイアウトエンジン「fdp」および「neato」でのみ機能します。

23
Stuart Golodetz

@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を上回り、グラフを生成することです。

12
tjvr