首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何为点格式在GraphViz中设置输出大小?

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

Stack Overflow用户
提问于 2013-02-09 02:44:38
回答 1查看 46.6K关注 0票数 46

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

我认为边框将是通过使用bb属性的解决方案,但点和新藤只是简单地覆盖它。

例如,我的图表:

代码语言:javascript
运行
复制
strict digraph {
    1,2,3;
    1 -> 3;
    3 -> 2;
}

neato -Gbb="0,0,50,50" -T dot file.txt输出

代码语言:javascript
运行
复制
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*的结果,如果有一种方法来告诉新的我的界限。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-12 06:01:55

这是TL;DR版本:

要从foo.gv中的图形生成900×1500像素的PNG图像,您可以运行:

代码语言:javascript
运行
复制
dot -Tpng -Gsize=9,15\! -Gdpi=100 -ofoo.png foo.gv

生成一幅宽为900像素或1500像素的图像,但不一定两者兼有;然后:

代码语言:javascript
运行
复制
convert foo.png -gravity center -background white -extent 900x1500 final.png

用空格填充图像,使其精确地为900×1500像素;其中convertImageMagick套件的一部分。

下面是详细的解释:

澄清:

  1. 属性标记为“只写”。,因此任何一个图形布局引擎都不可能尊重在处理之前提交的任何值。
  2. 在一般情况下,Graphviz可以生成矢量(可伸缩)图形和位图图形。,所以DPI并不总是有意义的度量。 特别是,dpi属性仅对位图和SVG输出格式有效。

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

让我们以一个任意图为例。

命令gvgen‎ -dh3将生成一个三级有向超立方体。(如果您想了解更多的细节,这里是gvgen手册页面的PDF格式,但这并不重要,它只是一个演示用的任意图形。)

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

代码语言:javascript
运行
复制
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属性从最大大小更改为所需的大小。现在,如果这两个维度都小于指定的大小,则绘图将被缩放,直到至少有一个维度等于指定的大小。

例如,运行:

代码语言:javascript
运行
复制
gvgen -dh3 | dot -Tpng -Gsize=3,5\! -oexample.png

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

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

点是怎么算出这些数字的?好吧,Graphviz的默认DPI值是每英寸96像素。在这种分辨率下,3×5英寸的图像是288×480像素的图像。布局引擎只需放大图像,直到至少有一个尺寸匹配所需的大小。

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

代码语言:javascript
运行
复制
gvgen -dh3 | dot -Tpng -Gsize=3,5\! -Gdpi=200 -oexample.png

现在,生成的图像测量600乘757像素。同样,Graphviz只需缩放图像,直到其中一个尺寸符合所需的大小(但在这种分辨率下,3×5英寸的图像是600×1000像素的图像)。

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

也就是说,假设您想要创建一个900×1500像素的图像。你可以用:

代码语言:javascript
运行
复制
gvgen -dh3 | dot -Tpng -Gsize=9,15\! -Gdpi=100 -oexample.png

代码语言:javascript
运行
复制
gvgen -dh3 | dot -Tpng -Gsize=3,5\! -Gdpi=300 -oexample.png

甚至:

代码语言:javascript
运行
复制
gvgen -dh3 | dot -Tpng -Gsize=900,1500\! -Gdpi=1 -oexample.png

(不过,虽然上一次测试似乎对我有效,但我还是建议坚持更传统的新闻部价值观,以防万一。)

这解决了大部分问题,但请注意,Graphviz只是在缩放图像,直到其中一个维度与指定大小匹配为止。根据您的原始图像的高宽比,您可能会或不可能得到确切的大小,您正在寻找。

这就是属性发挥作用的地方。

命令:

代码语言:javascript
运行
复制
gvgen -dh3 | dot -Tpng -Gsize=3,5\! -Gdpi=300 -Gratio=fill -oexample.png

应该为您提供一幅具有您所要寻找的精确尺寸的图像,但请注意以下几点:

  • 在实践中,有时它的大小似乎与预期略有不同。例如,当我运行上面的命令时,我会得到一个900×1472像素的图像(而不是900到1500)。我不知道这是不是因为四舍五入什么的。
  • 要实现这一点,Graphviz必须在每个维度中独立地缩放布局。它足够聪明,可以缩放布局,而不是图像,因此图像本身不会失真,但取决于所请求的纵横比与布局的“自然”纵横比有多大不同,水平间距与垂直间距看起来可能有点奇怪。

ratio还接受一些不同的值。看一下文献资料和/或实验,看看他们在做什么。

至于它的价值,如果你真的想要一个精确像素尺寸的图像,我的建议是让Graphviz缩放图像,这样两个维度中的一个匹配,然后使用像ImageMagick这样的东西来填充图像,以达到你想要的精确的纵横比。例如,命令:

代码语言:javascript
运行
复制
convert in.png -gravity center -background white -extent 900x1500 out.png

将图像(来自in.png)中心放在900×1500像素的画布上(保存到out.png中),必要时填充水平或垂直尺寸。

票数 90
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14784405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档