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

12
考虑下面这个最小的示例图,应该适合在A4纸上显示。
digraph G{
size="8.3,11.7!" ratio=fill;
foo->bar;
}

使用 neato -Tpdf -o min_ex.pdf min_ex.gv 进行编译。结果生成的PDF文件尺寸为236毫米×115毫米,而不是预期的210毫米×297毫米。

Graphviz无论对于比页面小的图形(如此例)还是需要缩小到适合页面的图形,都会忽略此属性。

我已经尝试了各种 sizeratio 属性组合,但都无法将图形放在A4页面上。

那么,我应该指定什么参数,才能始终将图形放在A4页面上,而不考虑其大小?

文档:

size:

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

如果定义并且绘图大于给定大小,则统一缩小绘图,使其适合给定大小。

如果 size 以感叹号结尾(!),则认为它是所需的大小。在这种情况下,如果绘图的两个维度都小于 size,则均匀缩放绘图,直到至少一个维度等于 size 中的维度为止。

ratio

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

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

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

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

如果 ratio = “expand”,size 属性被设置,并且图形的宽度和高度都小于 size 的值,则节点位置会均匀缩放,直到至少一个维度完全符合 size。请注意,

1个回答

13

问题在于比例的细节:

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

看来graphviz:

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

结果将比A4大。

因此,如果我们将节点和边距尽可能缩小,则输出应该相对接近A4。

margin设置为0,节点的shape设置为point,以及它们的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生成的图形将会得到一个尺寸为211x297毫米的PDF文件(使用8.267英寸作为宽度将会获得一个清晰的210x297毫米的文件)。


不幸的是,即使了解graphviz在ratio=fill方面的工作原理,我认为没有一种简单的方法可以确保当使用具有宽度和高度的节点时最终结果始终是A4大小。


1
警告!!!如果图形大小为4096x4096,并且使用“fill”,则在使用dot时(至少在Linux上)可能会“冻结”机器(实际上,机器在3分钟后回来,但我不得不杀死仍然引起麻烦的进程)。 - Aquarius Power

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接