2013-05-27 50 views
8

時間の経過とともにグラフが変化します(通常、新しいノードが追加されます)。私はグラフを何度か再生成し、すべてのノードがどこにいたのかを知りたい。これは、fdp - アルゴリズムでgraphvizを使用し、pin -flagを設定し、pos - 引数で位置を指定すると、部分的に機能します。ノード位置を保持するためにgraphvizを強制する

ほとんどの場合、これはかなりうまく機能します。しかし、特に新しいノードが追加されると、レイアウトが大幅に変化することがあります。これは避ける必要があります。実際にはオプションがありますこれらの固定位置を強制しますか?醜いグラフになるかもしれませんが、それは問題ありません。

答えて

14

Graphvizのは、それが簡単に同じ位置でのNOEを維持することはありません。

  • の追加/ノードを削除すると完全に異なるレイアウトを引き起こす可能性があります。
  • ノードを追加/削除すると、変更する境界ボックスのディメンションを変更できます。

グラフを作成するときに、すべてのノードが知られている場合は、次の作品:

  • すべての可能なノードを含むグラフを作成し、graphvizのは、それをレイアウトしてみましょう。グラフの先頭にnodes[pin=true];を追加することができます(後で追加する必要はありません)。
  • レイアウトグラフ:

    fdp -Tdot input.gv -o input.pos.gv 
    

    あなたは今、すべてのノードを含むドットファイルを持っています。

  • すべてのグラフについて、input.pos.gvのコピーを作成し、属性にstyle=invisを追加して不要なノードとエッジを隠すことができます。これにより、表示されないことが確認されますが、レイアウトで使用する場所はになりません。たとえば、グラフの最上部にある場合はです。
  • このような何か(neatoとオプション-n2は重要な部分であること)を使用して、それらをレイアウト:

    neato -n2 -Tpng input.pos.v1.gv -o output.v1.png 
    

例:

input.gv:

digraph g{ 
    node[pin=true]; 
    a -> b; 
    a -> c; 
    b -> d; 
    b -> e; 
    b -> f; 
    c -> g; 
} 

input.pos.modified.gv:

digraph g { 
    node [label="\N", pin=true]; 
    graph [bb="0,0,187,207"]; 
    a [pos="60.846,70.555", width="0.75", height="0.5", style=invis]; 
    b [pos="94.351,128.04", width="0.75", height="0.5"]; 
    c [pos="76.868,18.459", width="0.75", height="0.5"]; 
    d [pos="119.08,188.8", width="0.75", height="0.5",style=invis]; 
    e [pos="157.97,106.75", width="0.75", height="0.5"]; 
    f [pos="27.319,158.05", width="0.75", height="0.5"]; 
    g [pos="160.1,20.585", width="0.75", height="0.5"]; 
    a -> b [pos="e,84.434,111.03 70.717,87.493 73.42,92.13 76.411,97.263 79.332,102.27", style=invis]; 
    a -> c [pos="e,71.34,36.433 66.27,52.918 66.934,50.759 67.624,48.514 68.32,46.252", style=invis]; 
    b -> d [pos="e,111.86,171.05 101.5,145.62 103.54,150.61 105.8,156.17 108.01,161.59", style=invis]; 
    b -> e [pos="e,133.72,114.86 118.76,119.87 120.45,119.31 122.17,118.73 123.89,118.16"]; 
    b -> f [pos="e,49.99,147.9 71.657,138.2 67.726,139.96 63.572,141.82 59.447,143.67"]; 
    c -> g [pos="e,133.07,19.895 104.12,19.155 110.07,19.307 116.47,19.471 122.74,19.631"]; 
} 

入力。

output.png

隠れノード:変更せずにpngの

output with invisible nodes

+0

あなたの答えをありがとうございました!残念ながら、私は最初にすべてのノードを知っているわけではありません。背景情報:物理ネットワークを視覚化しています。物理ネットワークはいつでも変更できます(以前は未知のノードが追加され、接続が変更されました...)。また、エンドユーザーはノードを移動して独自のレイアウトを作成できるため、更新が実行されると完全に変更されるべきではありません。だから、これはgraphvizで達成できませんか?そうでない場合は、代替手段がありますか?私は年齢を探しています... – Remo

+0

サブグラフを作成したり、別々のグラフを作成して組み合わせたりすることも考えていました。それは可能だろうか?私は、新しいノードがうまく収まるという要求はありません。既存のすべてのノードの外側に配置することができ、必要に応じて接続が重複する可能性があります。 – Remo

+0

'pin'と' pos'を使って、新しいノードにデフォルト(またはランダム)の 'pos'値を加えることで試してみることができます。固定ノードの位置を持つためには、すべてのノードが 'pos'属性を持っている必要があります(エッジについてはわかりません)。 – marapet

関連する問題