如何在GraphViz中为点格式设置输出大小



我想确保布局后所有节点都在某个范围内(比如[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乘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乘1500像素;其中CCD_ 6是ImageMagick套件的一部分。

以下是详细解释:

澄清:

  1. bb属性被标记为"仅写",因此Graphviz布局引擎都不可能尊重您在处理之前提交的任何值。

  2. 在一般情况下,Graphviz可以生成矢量(可缩放)和位图图形,因此DPI并不总是一个有意义的度量。

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

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

让我们以任意图形为例。

命令gvgen‎ -dh3将生成一个三阶有向超立方体。(如果你想了解更多细节,这里有gvgen手册页的PDF格式,但没关系,这只是一个用于演示的任意图形。)

可以通过运行以下命令创建该图形的默认点生成PNG渲染:

gvgen -dh3 | dot -Tpng -oexample.png

当我这样做时,我会得到一个275 x 347像素的PNG格式(位图)图像。(如file example.png所述。)

size属性允许您为输出图像推荐最大或所需的高度和宽度(以英寸为单位)。即,属性size=3,5告诉Graphviz生成最多3×5英寸的图像。如果图像一开始小于3乘5,Graphviz将不使用它。如果图像一开始就大于3英寸乘5英寸,Graphviz会将其缩小,直到它适合3乘5英寸的画布(保留原始图像的纵横比)。

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

至少有一个例如,运行:

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

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

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

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

您可以使用dpi属性覆盖默认DPI值,如下所示:

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

现在生成的图像尺寸为600乘757像素。同样,Graphviz只是简单地放大图像,直到其中一个尺寸与所需尺寸匹配(但在该分辨率下,3×5英寸的图像是600×1000像素的图像)。

因此,如果要生成包含任意像素数的图像,则需要适当设置sizedpi

也就是说,假设您想要创建一个900乘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乘1472像素的图像(而不是900乘1500)。我不知道这是由于舍入误差还是什么原因。

  • 为了实现这一点,Graphviz必须在每个维度上独立缩放布局。缩放布局而不是图像足够聪明,因此图像本身不会失真,但根据您请求的纵横比与布局的"自然"纵横比的不同程度,水平与垂直间距可能看起来有点奇怪。

ratio也接受一些不同的值。查看文档和/或进行一些实验,看看它们的作用

值得一提的是,如果你真的想要一张你要求的精确像素尺寸的图像,我的建议是让Graphviz缩放图像,使两个尺寸中的一个匹配,然后使用ImageMagick之类的东西填充图像,以获得你想要的精确宽高比。例如,命令:

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

将通过根据需要填充水平或垂直维度,将图像(来自in.png)集中在900×1500像素的画布上(将其保存到out.png中)

相关内容

  • 没有找到相关文章

最新更新