【问题标题】:Graphviz ignores size attribute (A4 page)Graphviz 忽略尺寸属性(A4 页面)
【发布时间】:2013-07-17 04:01:30
【问题描述】:

考虑以下应该适合 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 页面上?

文档:

size:

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

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

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

ratio

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

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

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

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

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

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

【问题讨论】:

    标签: graphviz


    【解决方案1】:

    问题在于比率的细节:

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

    好像是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 与此图生成尺寸为 211x297mm 的 PDF(使用 8.267 inches as width 将生成干净的 210x297mm)。


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

    【讨论】:

    • 警告!!!如果图形大小为 4096x4096,使用“填充”它可能会在使用 dot 时“冻结”机器(实际上机器在 3 分钟后恢复,但我不得不杀死仍然造成问题的进程)(至少在linux)
    猜你喜欢
    • 1970-01-01
    • 2010-10-29
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多