1

以前の質問 ( dot/Graphviz を使用したブロック図のレイアウト) の後、さらに質問があります。以下のようにコンパイルされます。

ドット -Gsplines=none test.gv | neato -n -Gsplines=ortho -Tpng -otest.png

digraph G {
    graph [rankdir = LR];

    node[shape=record, style=filled];

bar[label="Bar", height=1.3636363636363635];
tea[label="Tea", height=1.3636363636363635];
brew[label="Brew", height=3.6363636363636362];
bar1[label="Bar1", height=2.2727272727272725];
baz[label="Baz", height=1];
foo[label="Foo", height=5.0];
darjeeling[label="Darjeeling", height=3.1818181818181817];
example[label="Example", height=17.727272727272727];

bar -> example [label="bar_clk"];
bar -> example [label="bar_bar"];
example -> tea [label="bli1"];
example -> tea [label="blo2"];
example -> tea [label="blo3"];
example -> brew [label="bli"];
example -> brew [label="blo"];
example -> brew [label="blo"];
example -> brew [label="blo"];
example -> brew [label="blo"];
example -> brew [label="blo"];
example -> brew [label="blo"];
example -> brew [label="blo"];
bar1 -> example [label="bar1_foo"];
bar1 -> example [label="bar1_bar"];
bar1 -> example [label="bar1_baz"];
bar1 -> example [label="bar1_baz1"];
bar1 -> example [label="bar1_bar2"];
baz -> example [label="baz_foo"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> bar [label="blu"];
example -> baz [label="ble"];
darjeeling -> example [label="darjeeling_bli1"];
darjeeling -> example [label="darjeeling_blo2"];
darjeeling -> example [label="darjeeling_blo3"];
darjeeling -> example [label="darjeeling_bli1"];
darjeeling -> example [label="darjeeling_blo2"];
example -> darjeeling [label="bla"];
darjeeling -> example [label="darjeeling_blo3"];
}

私の質問は、たとえば、バズ ノードとダージリン ノードを左側に移動して、中間ノードの高さを下げる方法です。これは何が決め手なのかわからない。これは有向グラフであることを理解しています。したがって、図の一般的な「流れ」は左から右です。もっと制御したいと思います。

これらのダイアグラムは自動的に生成されるため、この特定の例で機能させるコード スニペットではなく、希望どおりにレイアウトする方法とその理由についての説明をお勧めします。

4

1 に答える 1

2

いくつかのポイント:

たとえば、バズ ノードとダージリン ノードを左側に移動する方法

ExampleからBazおよびDarjeelingconstraint=falseに向かうエッジを設定するか、すべてのノードをグループ化して、サブグラフのExampleの左側に.rank=min

これは適切な解決策ではないと言うかもしれません (少なくとも の解決策ではありませんconstraint=false)。

これらの図は自動的に生成されます

そして私は完全に理解しています(何度もそこにいました)-しかし同時に、あなたは望む

中間ノードの高さを下げる

これは手動で設定されているため、グラフはまだ完全に自動生成されていません (に必要な高さをどのように計算しますか?)。

これは何が決め手なのかわからない

どちらも完全にはわかりません-バズは左側にいる可能性があります。

驚くべきことに、ノードの出現順序によってレイアウトが変わる場合があります。たとえば、ダージリン ノードの定義を上に移動すると、左側に表示されます (バーは右側に表示されます)。


編集:ここにコードスニペットがあります...

3 番目の可能性は、すべてのエッジを正しい順序 (上から下/左から右) で定義し、エッジをで装飾することdir=backです。

この3行を変更すると

example -> bar [label="blu"];
example -> baz [label="ble"];
example -> darjeeling [label="bla"];

の中へ

bar -> example [label="blu", dir=back];
baz -> example [label="ble", dir=back];
darjeeling -> example [label="bla", dir=back];

または

example -> bar [label="blu", constraint=false];
example -> baz [label="ble", constraint=false];
example -> darjeeling [label="bla", constraint=false];

(および の高さを変更example)

あなたは得るでしょう

グラフビズ結果

于 2011-11-07T22:28:03.280 に答える