强制节点直接位于另一个节点之下

时间:2012-12-31 07:26:55

标签: graph graphviz dot

我有一张从左到右排列的图表。但是,这个图的某些元素我想要相对于另一个节点定位。例如,如果我有这个图:

digraph "Test" {
    rankdir = "LR"
    A -> B
    B -> C
    D -> B
    note -> B

    note [ shape="house" ]
};

它呈现如下:

Normal DOT layout

但是,我希望“note”节点始终直接位于它所指向的节点下面,就像这个(手动创建的)图形一样:

Desired DOT layout

我尝试使用不同rankdir的子图并尝试使用rankconstraint属性进行试验,但是我没有成功实现此功能,因为我只是几天一直在玩DOT。

2 个答案:

答案 0 :(得分:5)

以下是您可以执行的操作:在定义边之前枚举节点,并将约束节点A置于与节点note相同的等级,方法是将它们放在子图:

digraph "Test" {
    rankdir = "LR"
    A;D;
    {rank=same; note; B;}
    C;

    A -> B
    B -> C
    D -> B
    B -> note [dir=back]

    note [ shape="house" ]
};

请注意,为了让节点note位于节点A下方,我必须反转边缘方向并添加dir=back才能正确绘制箭头。

graphviz output

答案 1 :(得分:3)

移动节点的一般技术是创建不可见边。在您的情况下,您可以创建从Anote的边缘,将其标记为不可见,然后将边缘从note标记为B作为非约束:

A -> note [style="invis"];
note -> B [constraint=false];