强制graphviz保留节点位置

Rem*_*emo 8 sticky graphviz nodes

我有一个随时间变化的图表(通常,添加了新节点).我需要多次重新生成图形,并希望所有节点都保持原样.当使用graphviz和fdp-algorithm,设置pin-flag并使用-argument指定位置时,这部分pos有效.

在大多数情况下,这非常有效.但特别是当添加新节点时,布局有时会发生巨大变化 - 我需要避免这种情况.是否可以选择实际强制这些固定位置?它可能会导致一个丑陋的图形,这将是正常的 - 但它们只需要坚持.

mar*_*pet 14

Graphviz不容易让noes保持在同一位置:

  • 添加/删除节点可能会导致完全不同的布局.
  • 添加/删除节点可以更改要更改的边界框的尺寸.

如果在创建图形时已知所有节点,则以下情况有效:

  • 创建一个包含所有可能节点的图形,并让graphviz进行布局.您可以nodes[pin=true];在图表的开头添加(然后您不必在以后添加它).
  • 布局图:

    fdp -Tdot input.gv -o input.pos.gv
    
    Run Code Online (Sandbox Code Playgroud)

    您现在有一个包含所有节点的点文件.您可以将其用作要创建的所有图形的基本文件:

  • 对于每个图形,input.pos.gv通过添加style=invis其属性来创建并隐藏不需要的节点和边缘.这样可以确保它们不会显示,但是,它们在布局中使用的位置也不会被裁剪掉(例如,如果位于图形的最顶部).
  • 使用类似的东西(neato以及选项-n2作为重要部分)将它们展开:

    neato -n2 -Tpng input.pos.v1.gv -o output.v1.png
    
    Run Code Online (Sandbox Code Playgroud)

例:

input.gv:

digraph g{
    node[pin=true];
    a -> b;
    a -> c;
    b -> d;
    b -> e;
    b -> f;
    c -> g;
}
Run Code Online (Sandbox Code Playgroud)

input.pos.modified.gv:

digraph g {
    node [label="\N", pin=true];
    graph [bb="0,0,187,207"];
    a [pos="60.846,70.555", width="0.75", height="0.5", style=invis];
    b [pos="94.351,128.04", width="0.75", height="0.5"];
    c [pos="76.868,18.459", width="0.75", height="0.5"];
    d [pos="119.08,188.8", width="0.75", height="0.5",style=invis];
    e [pos="157.97,106.75", width="0.75", height="0.5"];
    f [pos="27.319,158.05", width="0.75", height="0.5"];
    g [pos="160.1,20.585", width="0.75", height="0.5"];
    a -> b [pos="e,84.434,111.03 70.717,87.493 73.42,92.13 76.411,97.263 79.332,102.27", style=invis];
    a -> c [pos="e,71.34,36.433 66.27,52.918 66.934,50.759 67.624,48.514 68.32,46.252", style=invis];
    b -> d [pos="e,111.86,171.05 101.5,145.62 103.54,150.61 105.8,156.17 108.01,161.59", style=invis];
    b -> e [pos="e,133.72,114.86 118.76,119.87 120.45,119.31 122.17,118.73 123.89,118.16"];
    b -> f [pos="e,49.99,147.9 71.657,138.2 67.726,139.96 63.572,141.82 59.447,143.67"];
    c -> g [pos="e,133.07,19.895 104.12,19.155 110.07,19.307 116.47,19.471 122.74,19.631"];
}
Run Code Online (Sandbox Code Playgroud)

input.png没有修改:

output.png

隐藏节点:

输出具有不可见的节点