Graphviz忽略大小属性(A4页面)

J. *_*wen 7 graphviz

请考虑以下适用于A4页面的最小示例图表

digraph G{
size="8.3,11.7!" ratio=fill;
foo->bar;
}
Run Code Online (Sandbox Code Playgroud)

编译neato -Tpdf -o min_ex.pdf min_ex.gv 结果pdf文件的尺寸为236mm x 115mm,而不是预期的210mm x 297mm.

Graphviz对于小于页面的图形(如此图形)以及必须按比例缩小以适合的图形忽略此属性.

我已经尝试了任何组合sizeratio属性,我无法将图形放在A4页面上.

那么,我有什么要说明图表总是放在A4页面上,无论其大小如何?

文档:

大小:

最大宽度和绘图高度,以英寸为单位.如果只给出一个数字,则用于宽度和高度.

如果已定义且绘图大于给定大小,则绘图将按比例缩小,以使其适合给定大小.

如果大小以惊叹号(!)结束,那么它将被视为所需的大小.在这种情况下,如果图纸的两个尺寸都小于尺寸,则图纸被均匀地放大,直到至少一个尺寸等于其尺寸尺寸.

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

如果ratio是数字,则将其视为所需的宽高比.然后,如果实际纵横比小于期望比率,则按比例绘制拉伸高度以获得所需比率; 如果实际比率大于所需比率,则绘制宽度按比例放大.

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

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

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

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

mar*_*pet 10

问题在于比例的细节:

请注意,在强制执行大小属性约束之前会对此进行调整.此外,计算通常会忽略节点大小,因此最终的绘图大小可能只接近所需的大小.

看来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;
}
Run Code Online (Sandbox Code Playgroud)

neato -Tpdf使用此图表生成尺寸为211x297mm的PDF(使用8.267英寸作为宽度将产生干净的210x297mm).


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