web-dev-qa-db-ja.com

GraphVizでドット形式の出力サイズを設定する方法は?

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

bb属性を使用することでバウンディングボックスが解決されると考えましたが、dotの両方neatoは単にそれを上書きします。

たとえば、私のグラフ:

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の任意の値、またはsizedpiの任意の組み合わせに対して同じ位置を取得します。

私が必要なのは、与えられたボックス内にすべてのノードを持つことです。

これを行う方法はありますか?

詳細:

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

29
shinjin

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

exactly900 x 1500ピクセルになるように画像を空白で埋めます。ここで、convertImageMagick スイートの一部です。

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

明確にするために:

  1. bb属性は「書き込み専用」 としてマークされているため、Graphvizレイアウトエンジンはいずれも、処理前に送信した値を尊重しません。

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

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

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

例として任意のグラフを取り上げましょう。

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

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

gvgen -dh3 | dot -Tpng -oexample.png

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

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

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

たとえば、次を実行します。

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

\!はbashの感嘆符をエスケープします。DOTファイルでは、size=3,5!と書くだけです。)

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

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

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

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

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

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

つまり、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

(しかし、最後の1つは簡単なテストではうまくいくように見えましたが、念のために、より一般的なDPI値を使用することをお勧めします。)

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

これは、 ratio属性 が作用する場所です。

コマンド:

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

探している正確な寸法の画像を提供する必要がありますが、いくつか注意点があります。

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

  • これを実現するには、Graphvizは各次元で独立してレイアウトをスケーリングする必要があります。 layoutではなくimageではなく、画像自体は歪みませんが、要求されたアスペクト比がレイアウトの「自然な」アスペクト比とどれだけ異なるかによって、水平と垂直の間隔が少し奇妙に見える場合があります。

ratioは、いくつかの異なる値も受け入れます。 ドキュメントを参照してください および/または少し実験して、それらの機能を確認してください。

それが価値があることについて、あなたが文字通りあなたが要求している正確なピクセル寸法の画像が欲しいなら、私の提案はGraphvizに2つの寸法の1つが一致するように画像を拡大縮小させ、 ImageMagick を使用して、探している正確な縦横比に画像を埋め込みます。たとえば、次のコマンド:

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

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

65
Rod