generator - 脚本如何最佳地布局纯分层的graphviz/dot图?

标签 generator hierarchy graphviz dot

我将要编写一个脚本来生成具有以下两个特征的graphviz/dot图:

  • 除了一个节点外,其他所有节点实际上都有一个父节点(因此,它是一棵树)。
  • 如果两个或更多节点共享样本父节点,则它们本身就是
    按照特定的顺序。

  • 具有这些特征,我希望得到的结果(即点生成的图)看起来像这样:
  • 没有边缘应该穿过
  • 具有相同父级的节点与图形顶部边框的距离应相同。
  • 具有相同父级的节点应按照从左到右的顺序绘制
    给他们订购

  • 但是,我无法使dot表现出自己想要的方式。这是一个点文件来演示我的问题:
    digraph G {
    
      node [shape=plaintext fontname="Arial"];
    
      0  [label="zero"      ];
      1  [label="one"       ];
      2  [label="two"       ];
      3  [label="three"     ];
      4  [label="four"      ];
      5  [label="five"      ];
      6  [label="six"       ];
      7  [label="seven"     ];
      8  [label="eight"     ];
      9  [label="nine"      ];
      10 [label="ten"       ];
      11 [label="eleven"    ];
      12 [label="twelve"    ];
      13 [label="thirteen"  ];
      14 [label="fourteen"  ];
      15 [label="fivteen"   ];
      16 [label="sixteen"   ];
      17 [label="seventeen" ];
      18 [label="eighteen"  ];
      19 [label="nineteen"  ];
      20 [label="twenty"    ];
      21 [label="twenty-one"];
      22 [label="twenty-two"];
    
      0  -> 1  [arrowhead=none];
      1  -> 2  [arrowhead=none];
      2  -> 7  [arrowhead=none];
      7  -> 8  [arrowhead=none];
      8  -> 9  [arrowhead=none];
      8  -> 10 [arrowhead=none];
      9  -> 10 [color="#aaaaaa" constraint=false];
      10 -> 11 [arrowhead=none];
      10 -> 12 [arrowhead=none];
      11 -> 12 [color="#aaaaaa" constraint=false];
      7  -> 13 [arrowhead=none];
      8  -> 13 [color="#aaaaaa" constraint=false];
      13 -> 14 [arrowhead=none];
      7  -> 15 [arrowhead=none];
      13 -> 15 [color="#aaaaaa" constraint=false];
      15 -> 16 [arrowhead=none];
      15 -> 17 [arrowhead=none];
      16 -> 17 [color="#aaaaaa" constraint=false];
      2  -> 3  [arrowhead=none];
      7  -> 3  [color="#aaaaaa" constraint=false];
      3  -> 4  [arrowhead=none];
      2  -> 5  [arrowhead=none];
      3  -> 5  [color="#aaaaaa" constraint=false];
      5  -> 6  [arrowhead=none];
      2  -> 18 [arrowhead=none];
      5  -> 18 [color="#aaaaaa" constraint=false];
      18 -> 19 [arrowhead=none];
      19 -> 20 [arrowhead=none];
      19 -> 21 [arrowhead=none];
      20 -> 21 [color="#aaaaaa" constraint=false];
      18 -> 22 [arrowhead=none];
      19 -> 22 [color="#aaaaaa" constraint=false];
    }
    

    结果是

    请注意, sibling 之间的排序由灰色边缘(箭头)指示。

    因此,例如,我对七个->三个->五个->十八个 sibling 感到满意,因为它们是按照正确的顺序从左到右绘制的(如箭头所示)。

    但是我对8个 sibling -> 13-> 15个 sibling 感到不满意,因为它们的边缘与其他边缘相交,并且因为它们的排列顺序不像我想要的那样从左到右。

    而且,九个->十个,二十个->二十一个和十九个-> 22个方向错误。

    我知道,如果我使用其他(不可见的)边缘和weight属性,甚至可能使用更多功能,就可以随意获得图片。但是由于图形(其中有许多图形)是由脚本生成的,所以我无法手动执行此操作。

    那么,有没有办法实现我想要的?

    最佳答案

    在这种情况下,它实际上非常简单:脚本中节点的出现顺序确实很重要。在您的脚本中,它们从节点0到节点22出现,并进行布局以尽可能地尊重这一点。但是,它们应该按照您添加边的顺序出现(0,1,2,7,3,5,18,...)。因此,最简单的解决方案是将定义标签的块移动到定义边缘的块之后,您将获得:

    没有权重,没有看不见的边缘,也没有看不见的节点。

    关于generator - 脚本如何最佳地布局纯分层的graphviz/dot图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9238672/

    相关文章:

    python - 生成器、yield、发送 python

    javascript - (为什么)我不能从生成器中抛出异常吗?

    javascript - 如何在 typescript 中使用生成器函数

    python - 需要了解 Python 生成器对象

    python - Pydot 涉及解析 ':' 字符后跟数字时出错

    python - Keras:安装 graphviz 和 pydot 后的 "RuntimeError: Failed to import pydot."

    c# - 为层次结构中的实体获取父级

    wordpress - 如何使 woocommerce 产品标签分层?

    c++ - 为什么以下 CRTP 层次结构无法编译?

    python - 带有 graphviz_layout 的水平树