nodes - 强制 graphviz 保留节点位置

标签 nodes graphviz sticky

我有一个随时间变化的图表(通常会添加新节点)。我需要多次重新生成图形,并希望所有节点都保持在原来的位置。这在使用带有 fdp 的 graphviz 时部分有效-算法,设置pin -flag 并用 pos 指定位置-争论。

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

最佳答案

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

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

  • 如果在创建图形时所有节点都已知,则以下操作有效:
  • 创建一个包含 的图形全部 可能的节点,并让 graphviz 将其布局。您可以添加 nodes[pin=true];在图表的开头(那么您以后不必添加它)。
  • 布局图形:
    fdp -Tdot input.gv -o input.pos.gv
    

    您现在有一个包含所有节点的点文件。您可以将其用作要创建的所有图形的基本文件:
  • 对于每个图形,创建 input.pos.gv 的副本并通过添加 style=invis 隐藏不需要的节点和边到他们的属性。这确保它们不会显示,而且它们在布局中使用的位置不会被裁剪掉(例如,如果在图表的最顶部)。
  • 使用这样的东西来布置它们(neato 和选项 -n2 是重要的部分):
    neato -n2 -Tpng input.pos.v1.gv -o output.v1.png
    


  • 例子:

    输入.gv:
    digraph g{
        node[pin=true];
        a -> b;
        a -> c;
        b -> d;
        b -> e;
        b -> f;
        c -> g;
    }
    

    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"];
    }
    

    input.png 没有修改:

    output.png

    隐藏节点:

    output with invisible nodes

    关于nodes - 强制 graphviz 保留节点位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16775844/

    相关文章:

    HTML/CSS 使页眉和导航粘在页面顶部

    jquery - 粘性标题动画在滚动条上弹跳

    node.js - react js : Rendering multiple index html in a single page applications

    java - 变量名无法解析为变量 - 我找不到问题所在

    algorithm - 我应该使用什么类型的算法?

    graphviz - 具有多个边(从不同节点)到具有相同标签的一个节点的简写

    javascript - 关闭和垃圾收集 : most efficient way to remove consecutive nodes from a linked list

    excel - 如何创建重叠条形图?

    Graphviz (DOT),同一标签中的不同字体大小

    arrays - 如何在移动设备上实现粘性标题