レイアウト後、すべてのノードが特定の範囲([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
の任意の値、またはsize
とdpi
の任意の組み合わせに対して同じ位置を取得します。
私が必要なのは、与えられたボックス内にすべてのノードを持つことです。
これを行う方法はありますか?
詳細:
networkxの* graphviz_layout *を使用してグラフをレイアウトしています。 pyprocessingでグラフを描画します。代わりにneatoに自分の境界を伝える方法がある場合、* graphviz_layout *からの結果の再スケーリングを避けたい。
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ピクセルになるように画像を空白で埋めます。ここで、convert
は ImageMagick スイートの一部です。
明確にするために:
bb
属性は「書き込み専用」 としてマークされているため、Graphvizレイアウトエンジンはいずれも、処理前に送信した値を尊重しません。
一般的な場合、 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ピクセルの画像です)。
したがって、任意の数のピクセルを含む画像を生成する場合は、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
(しかし、最後の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
に保存して)中央揃えします。