【问题标题】:How to set the output size in GraphViz for the dot format?如何在 GraphViz 中为点格式设置输出大小?
【发布时间】:2013-02-09 02:44:38
【问题描述】:

我想确保所有节点在布局后都在某个范围内(比如 [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* 的结果。

【问题讨论】:

    标签: graphviz networkx pygraphviz pyprocessing


    【解决方案1】:

    这是 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. The bb attribute is marked as "write-only",因此任何 Graphviz 布局引擎都不会尊重您在处理之前提交的任何值。

    2. 在一般情况下,Graphviz can generate both vector (scalable) and bitmap graphics,因此 DPI 并不总是一个有意义的指标。

      特别是,dpi 属性仅对位图和 SVG 输出格式有效。

    您要做的有点复杂,因为 Graphviz 生成的图像的像素大小是由几个交互属性驱动的。

    我们以任意图为例。

    命令gvgen‎ -dh3 将生成一个三阶有向超立方体。 (如果您想了解更多详细信息,gvgen 手册页的 PDF 版本是 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 属性从最大大小更改为所需 大小。现在,如果两个尺寸都小于指定尺寸,则绘图将按比例放大,直到至少一个尺寸等于指定尺寸。

    例如,运行:

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

    (请注意,\! 转义了 bash 的感叹号。在 DOT 文件中,您只需编写 size=3,5!。)

    生成一个 288 x 363 像素的图像,在两个维度上都比默认值略大。

    dot 是如何得出这些数字的?好吧,Graphviz 的默认 DPI 值是每英寸 96 像素。在该分辨率下,3 x 5 inch 图像是 288 x 480 pixel 图像。布局引擎只是简单地按比例放大图像,直到至少有一个尺寸与所需尺寸匹配。

    您可以使用dpi attribute 覆盖默认 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 attribute 发挥作用的地方。

    命令:

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

    应该给你一个你正在寻找的精确尺寸的图像,但有几个警告:

    • 在实践中,它似乎有时会产生与预期略有不同的大小。例如,当我运行上面的命令时,我得到一个 900 x 1472 像素的图像(而不是 900 x 1500)。不知道是舍入误差还是什么原因。

    • 为此,Graphviz 必须在每个维度上独立缩放布局。缩放 layout 而不是 image 足够聪明,因此图像本身不会失真,但取决于您请求的宽高比与布局的“自然”纵横比水平与垂直间距可能看起来有点奇怪。

    ratio 也接受一些不同的值。请参阅 the documentation 和/或进行一些实验以了解它们的作用。

    对于它的价值,如果你真的想要一张你要求的精确像素尺寸的图像,我的建议是让 Graphviz 缩放图像,使两个尺寸中的一个匹配,然后使用类似 ImageMagick 的东西填充图像以获得您正在寻找的精确纵横比。例如,命令:

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

    将图像(来自in.png)在900 x 1500像素的画布上居中(将其保存到out.png),并根据需要填充水平或垂直尺寸

    【讨论】:

    • 这是一篇精彩的文章。感谢您花时间去做! +1,希望我能为你接受。
    • 我在 pdf 输出方面遇到了类似的问题。然后我found out 表示我需要为分页媒体调整margin
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2022-01-05
    • 2011-03-30
    相关资源
    最近更新 更多