3

グラフィックと詳細で質問を更新しました。marapetのおかげで、ハックがなければ、画像として目的の結果を生成することはできませんでした。

このコードがこのグラフを生成するのはなぜですか?

digraph {
 rankdir = TB;
 1 -> 2 -> 3 -> 1;
}

どうすればgraphviz/dotにこのような時計回りの方向を生成させることができますか?

アップデート

これが私が生成したい最後のグラフです(afaikはこのように論理的に修正します)

digraph {
  rankdir = TB
  start -> 1
  1 -> 2 -> 3 -> 1
  3 -> end
  3 -> increment
  end -> product
  {rank = same; 2; 3; increment}
  {rank = same; end; product}
}

この結果を生成します

これが欲しいのに

ありがとう

4

1 に答える 1

10

このコードがこのグラフを生成するのはなぜですか?

有向グラフは、その関係に応じてノードを異なるランクに配置します。1は2を指しているので、2を超えている必要があり、2は3を指しているので、3を超えています。しかし、3も1を指しているので、円は完成します。3つのノードのいずれかが上になる可能性があります。Graphvizは、最初に言及したノードを最上位に配置するだけです。したがって、代わりに次のように記述します。

2 -> 3 -> 1 -> 2;

ノード2が一番上になり、使用する場合

3 -> 1 -> 2 -> 3;

ノード3が最上位ノードになります。

おそらく、レイアウトエンジンneatoがこのグラフに適していて、時計回りの方向のグラフを作成します。

neatoレイアウト

どうしてもドットレイアウトエンジンを使用する必要がある場合は、次のドットコード

digraph {
  rankdir = TB;
  1 -> 2;
  3 -> 2 [dir=back];
  3 -> 1;
  {rank=same; 2; 3;}
}

エッジ2->3を3->2に変更すると同時に、矢印の方向を反転することにより、目的の出力を生成します。

または、同じ手法の他の変形で、説明が簡単です。すべての矢印の順序を逆にします(1-> 3-> 2-> 1)が、それらを逆方向に表示し(dir = back)、ノード2と3を強制します。同じランクになる:

rankdir = TB;
edge[dir=back];
1 -> 3 -> 2 -> 1;
{rank=same; 2;3;}

このハックにより、次の結果が得られます。

ハック

于 2011-02-03T19:26:38.543 に答える