首页 > 解决方案 > 创建循环时强制节点保持在顶部

问题描述

我有以下图表:


digraph G {
  u1, u2,  u3, u5 [ shape = oval, style=filled, fillcolor="palegreen"];

  u3 -> v3 -> v5_0 -> v5_1 -> v1;
  u5 -> v8 -> v5_1;
  v1 -> v5_2 -> v2; 
  u1 -> v2;
  v2 -> u2;
}

在此处输入图像描述

现在,我想要u2u3成为同一个节点,从某种意义上说,我希望底部的最后一个顶点有一条边上升到渲染图顶部的 u3。但如果我渲染:

digraph G {
  u1, u2,  u3, u5 [ shape = oval, style=filled, fillcolor="palegreen"];

  u3 -> v3 -> v5_0 -> v5_1 -> v1;
  u5 -> v8 -> v5_1;
  v1 -> v5_2 -> v2; 
  u1 -> v2;
  v2 -> u3;
}

在此处输入图像描述

u3节点最终位于图表的中间。我如何强迫u3自己处于领先地位?我尝试使用rank=min它,但这没有帮助。

标签: graphvizdigraphsgraph-drawing

解决方案


2个可能的解决方案:

  1. 在“违规”边缘上使用constraint=false ( https://graphviz.org/docs/attrs/constraint/ )

    u2 -> u3 [constraint=false]
    这会产生一个正确但非常丑陋的边缘:
    在此处输入图像描述

  2. 使用dir=back扭转“违规”的
    u3 -> u2 [dir=back] 边缘
    在此处输入图像描述


推荐阅读