42

レイアウト後、すべてのノードが一定の範囲内 ([0,0,W,H] など) にあることを確認したいと思います。

bb属性を使用して境界ボックスが解決策になると考えましたが、ドットネイトの両方が単にそれを上書きします。

たとえば、私のグラフ:

strict digraph {
    1,2,3;
    1 -> 3;
    3 -> 2;
}

の出力neato -Gbb="0,0,50,50" -T dot file.txt:

strict digraph {
        graph [bb="0,0,120.49,162.36"];
        node [label="\N"];
        1        [height=0.5,
                pos="27,18",
                width=0.75];
        3        [height=0.5,
                pos="70.233,75.918",
                width=0.75];
        1 -> 3   [pos="e,57.954,59.469 39.043,34.133 43.004,39.441 47.504,45.468 51.827,51.261"];
        2        [height=0.5,
                pos="93.485,144.36",
                width=0.75];
        3 -> 2   [pos="e,87.436,126.56 76.221,93.545 78.643,100.67 81.496,109.07 84.177,116.97"];
}

bbと の任意の値または任意の組み合わせに対して同じ位置を取得しsizeますdpi

私が必要とするのは、特定のボックス内にすべてのノードを配置することです。

これを行う方法について何か提案はありますか?

全文:

グラフをレイアウトするために、networkxの*graphviz_layout* を使用しています。pyprocessingでグラフを描画します。*graphviz_layout* からの結果の再スケーリングを避けたいのですが、代わりに自分の境界を正しく伝える方法がある場合。

4

1 に答える 1

85

TL;DR バージョンは次のとおりです。

foo.gv のグラフから 900 x 1500 ピクセルの PNG 画像を生成するには、次のコマンドを実行します。

dot -Tpng -Gsize=9,15\! -Gdpi=100 -ofoo.png foo.gv

正確に幅 900 ピクセルまたは高さ 1500 ピクセルの画像を生成しますが、両方である必要はありません。その後:

convert foo.png -gravity center -background white -extent 900x1500 final.png

正確に900 x 1500 ピクセルになるように画像を空白でパディングします。ImageMagickスイートのconvert一部です。

詳細な説明は次のとおりです。

明確にするために:

  1. このbb属性は "write-only" としてマークされているため、どの Graphviz レイアウト エンジンも、処理前に送信された値を尊重しない可能性があります。

  2. 一般に、Graphviz はベクター (スケーラブル) とビットマップ グラフィックスの両方を生成できるため、DPI は必ずしも意味のあるメトリックではありません。

    特に、このdpi属性はビットマップおよび SVG 出力形式でのみ有効です。

Graphviz によって生成された画像のピクセル サイズは、いくつかの相互作用する属性によって駆動されるため、あなたがしようとしていることは少し複雑です。

例として、任意のグラフを見てみましょう。

このコマンドgvgen‎ -dh3は、次数 3 の有向ハイパーキューブを生成します。(これについてさらに詳しく知りたい場合は、gvgen のマニュアル ページの PDF 版がここにありますが、問題ではありません。デモ用の任意のグラフにすぎません。)

そのグラフのデフォルトのドット生成 PNG レンダリングは、次のコマンドを実行して作成できます。

gvgen -dh3 | dot -Tpng -oexample.png

これを行うと、275 x 347 ピクセルの PNG 形式 (ビットマップ) の画像が得られます。(報告によるとfile example.png。)

このsize属性を使用すると、出力イメージの最大または希望の高さと幅をインチ単位で推奨できます。つまり、この属性は、Graphviz に最大でsize=3,53 x 5 インチの画像を生成するように指示します。そもそも画像が 3 x 5 より小さい場合、Graphviz はそれをそのままにします。最初に画像が 3 x 5 インチよりも大きい場合、Graphviz は 3 x 5 インチのキャンバスに収まるまで縮小します (元の画像の縦横比を維持します)。

感嘆符を追加すると、size属性が最大サイズから目的のサイズに変更されます。両方の寸法が指定されたサイズよりも小さい場合、少なくとも 1 つの寸法が指定されたサイズに等しくなるまで図面が拡大されます。

たとえば、次のように実行します。

gvgen -dh3 | dot -Tpng -Gsize=3,5\! -oexample.png

( bash の感嘆符をエスケープすることに注意してください\!。DOT ファイルでは、単に と記述しsize=3,5!ます。)

は、288 x 363 ピクセルの画像を生成します。デフォルトよりも両方のサイズがわずかに大きくなります。

ドットはどのようにしてこれらの数字を思いついたのですか? さて、Graphviz のデフォルトの DPI 値は 96 ピクセル/インチです。その解像度では、3 x 5インチのイメージは 288 x 480ピクセルのイメージです。レイアウト エンジンは、寸法の少なくとも 1 つが目的のサイズに一致するまで、単純に画像を拡大しました。

次のように、dpi属性を使用してデフォルトの DPI 値をオーバーライドできます。

gvgen -dh3 | dot -Tpng -Gsize=3,5\! -Gdpi=200 -oexample.png

生成された画像のサイズは 600 x 757 ピクセルになります。ここでも、Graphviz は、寸法の 1 つが目的のサイズに一致するまで単純に画像を拡大しました (ただし、この解像度では、3 x 5 インチの画像は 600 x 1000 ピクセルの画像になります)。

sizeしたがって、任意の数のピクセルを含む画像を生成する場合は、 と の両方をdpi適切に設定する必要があります。

つまり、900 x 1500 ピクセルの画像を作成したいとします。あなたが使用することができます:

gvgen -dh3 | dot -Tpng -Gsize=9,15\! -Gdpi=100 -oexample.png

また

gvgen -dh3 | dot -Tpng -Gsize=3,5\! -Gdpi=300 -oexample.png

あるいは:

gvgen -dh3 | dot -Tpng -Gsize=900,1500\! -Gdpi=1 -oexample.png

(しかし、最後のものは簡単なテストではうまくいくように見えましたが、念のため、より従来の DPI 値に固執することをお勧めします。)

これで問題のほとんどは解決しますが、Graphviz は、いずれかの寸法が指定されたサイズに一致するまで画像をスケーリングするだけであることに注意してください。元の画像の縦横比によっては、探している正確なサイズが得られる場合と得られない場合があります。

ここでratio属性の出番です。

コマンド:

gvgen -dh3 | dot -Tpng -Gsize=3,5\! -Gdpi=300 -Gratio=fill -oexample.png

探している正確な寸法の画像が表示されるはずですが、いくつかの注意事項があります。

  • 実際には、必要なサイズとはわずかに異なるサイズになることがあります。たとえば、上記のコマンドを実行すると、(900 x 1500 ではなく) 900 x 1472 ピクセルのイメージが得られます。これが丸め誤差によるものかどうかはわかりません。

  • これを実現するために、Graphviz は各次元でレイアウトを個別にスケーリングする必要があります。画像ではなくレイアウトをスケーリングするのに十分スマートであるため、画像自体が歪むことはありませんが、要求されたアスペクト比がレイアウトの「自然な」アスペクト比とどの程度異なるかによって、水平方向と垂直方向の間隔が少し見える場合があります。変。

ratioいくつかの異なる値も受け入れます。ドキュメントを参照するか、少し実験して、それらが何をするかを確認してください。

価値があるのは、文字通り、要求している正確なピクセル寸法の画像が必要な場合、私の提案は、Graphviz が 2 つの寸法のいずれかが一致するように画像をスケーリングし、ImageMagickのようなものを使用して画像をパディングすることです。探している正確なアスペクト比に到達します。たとえば、次のコマンド:

convert in.png -gravity center -background white -extent 900x1500 out.png

必要に応じて水平方向または垂直方向の寸法をパディングするin.pngことにより、900 x 1500 ピクセルのキャンバス ( に保存)の画像 ( から) を中央に配置します。out.png

于 2013-12-12T06:01:55.033 に答える