簡體   English   中英

如何在 GraphViz 中為點格式設置輸出大小?

[英]How to set the output size in GraphViz for the dot format?

我想確保布局后所有節點都在某個范圍內(比如 [0,0,W,H])。

我認為邊界框將是使用bb屬性的解決方案,但dotneato 都簡單地覆蓋了它。

例如我的圖表:

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繪制圖形。 我想避免重新縮放 *graphviz_layout* 的結果,如果有辦法告訴neato 我的邊界。

這是 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 像素; 其中convertImageMagick套件的一部分。

這是詳細的解釋:

澄清:

  1. bb屬性被標記為 "write-only" ,因此沒有一個 Graphviz 布局引擎可能會尊重您在處理之前提交的任何值。

  2. 在一般情況下, 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 像素的圖像)。

因此,如果您想生成包含任意數量像素的圖像,您需要適當地設置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

(雖然最后一個在快速測試中似乎對我有用,但我建議堅持使用更傳統的 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.pngin.png放置在 900 x 1500 像素的畫布上(將其保存到out.png

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM