Заставить узел находиться непосредственно под другим узлом

У меня есть график, выложенный слева направо. Однако есть некоторые элементы этого графика, которые я хочу расположить относительно другого узла. Например, если у меня есть этот график:

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

    note [ shape="house" ]
};

Это выглядит следующим образом:

Обычный макет DOT

Однако я бы хотел, чтобы узел «заметка» всегда располагался непосредственно под узлом, на который он указывает, как на этом (созданном вручную) графике:

Желаемый макет DOT

Я пробовал экспериментировать с подграфом с другим rankdir и возиться с атрибутами rank и constraint, но не смог заставить это работать, так как я играл с DOT всего пару дней.


person Dave DeLong    schedule 31.12.2012    source источник


Ответы (2)


Вы можете перечислить узлы перед определением ребер, а затем ограничить узел B на тот же ранг, что и узел 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 был ниже узла B, мне пришлось изменить направление края и добавить dir=back, чтобы стрелка нарисовалась правильно.

вывод графвиза

person marapet    schedule 31.12.2012
comment
+1 это оказывается наиболее последовательным в своих результатах и ​​дает мне возможность продолжать. Спасибо! :) - person Dave DeLong; 31.12.2012
comment
^^^ Согласен! Возможность напрямую управлять рангами определенно была для меня новостью, спасибо, что так ясно объяснили!!! - person svenevs; 21.08.2017
comment
Это приводит к потере края на моем графике - person Blanc; 07.02.2021

Общий метод перемещения узлов заключается в создании невидимых ребер. В вашем случае вы можете создать ребро от A до note, пометить его невидимым, а затем пометить ребро от note до B как не ограничивающее:

A -> note [style="invis"];
note -> B [constraint=false];
person Edmund    schedule 31.12.2012
comment
+1 В моем случае это работает не очень стабильно, но это интересная техника. Спасибо! - person Dave DeLong; 31.12.2012