[英]How to set the output size in GraphViz for the dot format?
我想確保布局后所有節點都在某個范圍內(比如 [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繪制圖形。 我想避免重新縮放 *graphviz_layout* 的結果,如果有辦法告訴neato 我的邊界。
要從 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 像素; 其中convert
是ImageMagick套件的一部分。
澄清:
bb
屬性被標記為 "write-only" ,因此沒有一個 Graphviz 布局引擎可能會尊重您在處理之前提交的任何值。
在一般情況下, Graphviz 可以生成矢量(可縮放)和位圖圖形,因此 DPI 並不總是一個有意義的指標。
特別是, dpi
屬性僅對位圖和 SVG 輸出格式有效。
您要做的事情有點復雜,因為 Graphviz 生成的圖像的像素大小是由幾個交互屬性驅動的。
讓我們以任意圖為例。
命令gvgen -dh3
將生成一個gvgen -dh3
有向超立方體。 (如果您想了解更多詳細信息,這里有 gvgen 手冊頁的 PDF 版本,但這並不重要,它只是用於演示目的的任意圖形。)
可以通過運行以下命令來創建該圖形的默認點生成 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
屬性從最大大小更改為所需大小。 現在,如果兩個尺寸都小於指定尺寸,則將按比例放大繪圖,直到至少一個尺寸等於指定尺寸。
例如,運行:
gvgen -dh3 | dot -Tpng -Gsize=3,5\! -oexample.png
(請注意, \\!
轉義了 bash 的感嘆號。在 DOT 文件中,您只需編寫size=3,5!
。)
生成一個 288 x 363 像素的圖像,在兩個維度上都比默認值略大。
dot 是如何得出這些數字的? 好吧,Graphviz 的默認 DPI 值是每英寸 96 像素。 在該分辨率下,3 x 5英寸的圖像是 288 x 480像素的圖像。 布局引擎只是簡單地放大圖像,直到至少一個尺寸與所需尺寸匹配。
您可以使用dpi
屬性覆蓋默認 DPI 值,如下所示:
gvgen -dh3 | dot -Tpng -Gsize=3,5\! -Gdpi=200 -oexample.png
現在生成的圖像大小為 600 x 757 像素。 同樣,Graphviz 只是簡單地放大圖像,直到其中一個尺寸與所需尺寸匹配(但在此分辨率下,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 1472 像素的圖像(而不是 900 x 1500)。 我不知道這是由於四舍五入錯誤還是什么。
為了實現這一點,Graphviz 必須在每個維度上獨立地縮放布局。 它足夠智能,可以縮放布局而不是圖像,因此圖像本身不會失真,但是根據您請求的縱橫比與布局的“自然”縱橫比的不同,水平與垂直間距可能看起來有點奇怪的。
ratio
也接受一些不同的值。 請參閱文檔和/或進行一些實驗以了解它們的作用。
對於它的價值,如果您確實想要一張您所要求的精確像素尺寸的圖像,我的建議是讓 Graphviz 縮放圖像,以便兩個尺寸之一匹配,然后使用ImageMagick 之類的東西將圖像填充到獲得您正在尋找的精確縱橫比。 例如,命令:
convert in.png -gravity center -background white -extent 900x1500 out.png
通過根據需要填充水平或垂直尺寸,將圖像(來自in.png
) in.png
放置在 900 x 1500 像素的畫布上(將其保存到out.png
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.