8

時間の経過とともに変化するグラフがあります (通常、新しいノードが追加されます)。グラフを数回再生成する必要があり、すべてのノードを元の場所に固定したいと考えています。これは、graphviz を -algorithm とともに使用し、-flag をfdp設定し、pin-argument で位置を指定すると部分的に機能しposます。

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

4

1 に答える 1

14

Graphviz では、noes を同じ位置に保つのは簡単ではありません。

  • ノードを追加/削除すると、まったく異なるレイアウトになる可能性があります。
  • ノードを追加/削除すると、バウンディング ボックスの寸法が変更される場合があります。

以下は、グラフの作成時にすべてのノードがわかっている場合に機能します。

  • すべての可能なノードを含むグラフを作成し、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
    

例:

入力.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"];
}

変更なしのinput.png:

output.png

非表示のノード:

非表示のノードを含む出力

于 2013-05-27T20:34:53.793 に答える