Graphviz忽略大小属性(A4页)

Graphviz忽略大小属性(A4页),graphviz,Graphviz,考虑下面的最小示例图,它应该适合A4页面 digraph G{ size="8.3,11.7!" ratio=fill; foo->bar; } 使用neato-Tpdf-o min_ex.pdf min_ex.gv编译 生成的pdf文件的尺寸为236mm x 115mm,而不是预期的210mm x 297mm Graphviz忽略了这个属性,无论是对于小于页面的图形(如下图),还是必须缩小以适应的图形 我尝试了大小和比率属性的任何组合,但我无法将这些属性中的任何一个

考虑下面的最小示例图,它应该适合A4页面

digraph G{
size="8.3,11.7!" ratio=fill;
foo->bar;
}
使用neato-Tpdf-o min_ex.pdf min_ex.gv编译 生成的pdf文件的尺寸为236mm x 115mm,而不是预期的210mm x 297mm

Graphviz忽略了这个属性,无论是对于小于页面的图形(如下图),还是必须缩小以适应的图形

我尝试了
大小
比率
属性的任何组合,但我无法将这些属性中的任何一个放在A4纸上

那么,我有什么要指定的图形总是放在一个A4纸上,不管它的大小

文件:

:

图纸的最大宽度和高度,以英寸为单位。如果只给出一个数字,则宽度和高度都使用该数字

如果已定义且图形大于给定尺寸,则图形将均匀缩小,以使其符合给定尺寸

如果大小以感叹号(!)结尾,则取所需大小。在这种情况下,如果图形的两个尺寸都小于尺寸,则图形将均匀放大,直到至少一个尺寸等于其尺寸

设置图形的纵横比(图形高度/图形宽度)。请注意,这是在实施“大小”属性约束之前进行调整的。此外,计算通常忽略节点尺寸,因此最终图形尺寸可能仅与所需尺寸近似

如果比率为数字,则将其作为所需的纵横比。然后,如果实际纵横比小于所需比例,则放大绘图高度以达到所需比例;如果实际比率大于所需比率,则图形宽度将按比例增大

如果设置了ratio=“fill”和“size”属性,则将分别在x和y方向缩放节点位置,以便最终图形完全填充指定的大小。如果两个尺寸值都超过图形的宽度和高度,则每个节点的两个坐标值将相应放大。但是,如果任一尺寸标注小于图形中相应的尺寸标注,则会放大一个尺寸标注,以便最终图形具有与“尺寸”指定的相同的高宽比。然后,渲染时,布局将在两个维度上均匀缩小以适合给定的大小,这可能会导致节点和文本也收缩。这可能不是用户想要的,但它避免了如何以可接受的方式重新定位节点以减小图形大小的难题

如果设置了ratio=“compress”和size属性,dot将尝试压缩初始布局以适应给定的大小。这样可以实现更紧密的节点打包,但会降低平衡性和对称性。此功能仅适用于dot

如果ratio=“expand”,则设置了“大小”属性,并且图形的宽度和高度都小于“大小”值,则节点位置将均匀缩放,直到至少有一个维度正好适合大小。请注意,这与使用“大小”作为所需大小不同,因为此处在生成边之前展开图形,并且所有节点和文本大小保持不变

如果ratio=“auto”,则页面属性已设置,且图形无法在单个页面上绘制,则大小将设置为“理想”值。特别是,给定维度中的大小将是该维度中页面大小的最小整数倍,至少是当前大小的一半。然后将这两个尺寸单独缩放为新尺寸。此功能仅适用于dot


问题在于有关比率的细节:

请注意,这是在设置“大小”属性约束之前进行调整的 强制执行。此外,计算通常忽略节点大小, 因此,最终图纸尺寸可能仅与所需尺寸近似

看来格拉普维兹

  • 将节点布置为点(忽略大小)
  • 调整点节点的比率(仍然没有节点的大小)
  • 应用图形的大小约束(在本例中,放大图像):这里我们已经达到了所需的尺寸,但还没有完成
  • 然后点节点变为实际大小的节点(默认情况下高0.5英寸,宽0.75英寸)
  • 最后,整个输出得到了额外的利润
结果将大于A4

因此,如果我们要使节点和边距尽可能小,那么输出应该相对接近A4。

使用下图将
边距
设置为0,将节点的
形状
设置为
及其
宽度
高度
设置为最小值:

digraph G{
 ratio="fill";
 size="8.3,11.7!";
 margin=0;

 node[shape=point, height=0.02, width=0.01];
 foo->bar;
}
neato-Tpdf
使用此图生成尺寸为211x297mm的PDF(使用将生成干净的210x297mm)



不幸的是,即使知道graphviz在
ratio=fill
方面是如何工作的,我也不认为在使用实际具有宽度和高度的节点时,有一种简单的方法可以确保最终结果始终是A4。

警告!!!如果图形大小类似于4096x4096,则在使用
dot
(至少在linux上)时,使用“fill”可能会“冻结”机器(实际上,机器在3分钟后返回,但我必须终止仍然导致故障的进程)