10

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

digraph G{
size="8.3,11.7!" ratio=fill;
foo->bar;
}

编译neato -Tpdf -o min_ex.pdf min_ex.gv 生成的 pdf 文件的尺寸为 236 毫米 x 115 毫米,而不是预期的 210 毫米 x 297 毫米。

Graphviz 对于小于页面的图形(例如这个)和必须缩小以适应的图形都忽略此属性。

我已经尝试过任何组合sizeratio属性,我无法将图表与它们中的任何一个一起放在 A4 页面上。

那么,我有什么要指定图表始终放在 A4 页面上,无论其大小如何?

文档:

尺寸

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

如果已定义且绘图大于给定尺寸,则绘图将统一按比例缩小,使其适合给定尺寸。

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

比率

设置绘图的纵横比(绘图高度/绘图宽度)。请注意,这是在强制执行大小属性约束之前进行调整的。此外,计算通常会忽略节点尺寸,因此最终图纸尺寸可能仅接近所需的尺寸。

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

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

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

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

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

4

1 回答 1

11

问题在于比率的细节:

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

看来graphviz

  • 将节点布置为点(忽略大小)
  • 调整点节点的比例(仍然没有节点的大小)
  • 应用图形的大小约束(在我们的例子中,放大图像):这里我们已经达到了所需的尺寸,但我们还没有完成......
  • 然后点节点成为具有实际大小的节点(默认为 0.5 英寸高和 0.75 英寸宽)
  • 最后整个输出得到添加的边距

结果将大于 A4。

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

使用下图设置margin为 0 和节点的shapepoint以及它们的值widthheight最小值:

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(使用8.267 英寸作为宽度将产生干净的 210x297mm)。


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

于 2013-12-10T21:56:00.517 回答