我想确保所有节点在布局后都在某个范围内(例如[0,0,W,H])。

我认为边界框将是使用bb属性的解决方案,但点和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绘制图形。我想避免重新缩放来自* 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套件的一部分。

详细说明如下:

澄清:
  • The bb attribute is marked as "write-only",因此所有Graphviz布局引擎都不会尊重您在处理之前提交的任何值。
  • 通常情况下为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英寸乘5英寸,则Graphviz将对其进行缩小,直到适合3乘5英寸的 Canvas (保留原始图像的纵横比)为止。

    添加感叹号会将size属性从最大大小更改为所需大小。现在,如果两个尺寸均小于指定的尺寸,则按比例放大图形,直到至少一个尺寸等于指定的尺寸。

    例如,运行:
    gvgen -dh3 | dot -Tpng -Gsize=3,5\! -oexample.png
    

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

    生成一个288 x 363像素的图像,两个方向的尺寸都比默认尺寸稍大。

    点是如何得出这些数字的?好吧,Graphviz的默认DPI值为每英寸96像素。在该分辨率下,3 x 5英寸的图像是288 x 480像素的图像。布局引擎仅按比例放大图像,直到其中至少一个尺寸与所需大小匹配为止。

    您可以使用 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必须在每个维度上独立缩放布局。它足够聪明,可以缩放布局,而不缩放图像,因此图像本身不会失真,但是取决于您请求的宽高比与布局的“自然”长宽比有何不同,水平间距与垂直间距可能看起来有点不同奇怪的。
  • ratio也接受一些不同的值。请参阅the documentation和/或做一些试验以了解其作用。

    对于它的值(value),如果您确实想要一个您要求的精确像素尺寸的图像,我的建议是让Graphviz缩放图像,使两个尺寸之一匹配,然后使用ImageMagick这样的图像填充到获得所需的精确纵横比。例如,命令:
    convert in.png -gravity center -background white -extent 900x1500 out.png
    

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

    关于graphviz - 如何在GraphViz中为点格式设置输出大小?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14784405/

    10-12 22:23