2017-12-16 51 views
3

ドットを使用して配置するのに最適なgraphvizの有向グラフがある場合、同じランクの他のノードの周りに過剰なパディングを作成する大きなノードの問題を回避する方法はありますか?Graphvizのドットレイアウトが、同じランクの異なるサイズのノードを持つスペースを無駄にしないようにするにはどうすればよいですか?

digraph { 
    b[label="line 1\nline 2\nline 3\nline 4\nline 5\nline 6\n"]; 

    a -> b; 
    a -> c; 
    b -> f; 
    c -> d; 
    d -> e; 
    e -> f; 
} 

(result of the above)

グラフである必要はないランクの高さを増加させることにより、左側の経路に明らかに必要以上に高くなる:以下のグラフで例えば

、右手の道では背が高い。

おそらく2つのパスを別々にレイアウトする方法はありますか?私はクラスタのサブグラフを使うと助けになると思っていましたが、その場合でもランクの高さは完全にグローバルなようです。

私は、この画像編集(それは粗野だ言い訳してください)に似た結果を願っています:あなたはedge[constraint = false];を追加しようとするかもしれない問題を回避するには enter image description here

答えて

2


これは、すべてのエッジについてconstraint属性値を設定します:

Rendered graph

それとものみエッジの一部についてconstraint属性を指定します。


EDIT:私たちは部分グラフの助けを借りて達成することができますかなり近い結果:次のように

digraph { 

    rankdir = LR; 

    b[label="line 1\nline 2\nline 3\nline 4\nline 5\nline 6\n"]; 

    subgraph cluster_0 { 

     rank = same; 

     style = invis; 

     a -> c -> d -> e -> f [constraint = false]; 

    } 

    a -> b; 
    b -> f; 

} 

がレンダリングされます:

Rendered graph

+0

は残念ながら、それはでませんすべて私が求めているものに対処しています。ノード 'a'からノード 'f'までの2つのパスは、ノード 'b'の高さがなくても垂直方向に並んでいるため、すべてのノードを同じランクに移動するだけです。もう一方の道で物の詰め物を増やす。 私は明確な画像を含めるように質問を編集しました。 – Rednaxela

+0

@Rednaxela私は答えを更新しました。新しい結果はあなたの2番目のイラストレーションとよく似ています。 – user882813

+0

ああ、面白いです。これは賢明です。 "rankdir = LR"スタイルのグラフを使って、そのような方法で同じランクのノードを持つ垂直サブセクションを生成します。さて、これはこの単純な例では十分に機能しますが、ノードを列内で垂直方向に配置するように制限しています。私はこのアプローチがより大きな分岐を持つ大きなグラフに一般化するとは思わないが、私はその理由で対処しているだろう。 – Rednaxela

関連する問題