Graphviz: как выровнять узлы подграфа по прямой линии? - PullRequest
8 голосов
/ 10 марта 2011

Я пытаюсь визуализировать историю моего репозитория исходного кода с помощью Graphviz следующим образом (сверху вниз или слева направо не имеет значения):

m1 -> m2 ----> m3 -----> m4 -> m5
    \                    ^
     \-> b1 -> b2 -> b3 -/

Данный файл точек:

digraph git {
    subgraph master {
        m1 -> m2 -> m3 -> m4 -> m5
    }
    subgraph branch {
        m2 -> b1 // branch from master
        b1 -> b2 -> b3
        b3 -> m4 // merge into master
    }
}

какой атрибут я должен установить, чтобы все узлы подграфа (принадлежащего одной и той же ветви) были расположены на прямой линии?

Ответы [ 2 ]

15 голосов
/ 15 марта 2011

Самое простое решение - установить weight разветвляющихся и сливающихся ребер на 0:

digraph git {
    rankdir=LR
    subgraph master {
        m1 -> m2 -> m3 -> m4 -> m5
    }
    subgraph branch {
        m2 -> b1[weight=0] // branch from master
        b1 -> b2 -> b3
        b3 -> m4[weight=0] // merge into master
    }
}

rankdir=LR меняет макет сверху вниз влево-вправо.

graphviz graph

Смотрите также мои ответы на похожий вопрос: Преобразование узлов "основной линии" в прямую линию в Graphviz (или альтернативы)

3 голосов
/ 17 марта 2011

Вы можете использовать настройку атрибута rank = same

Я думаю, что ваш конкретный график в любом случае выстроен в две идеальные линии, но если бы он был более сложным, вы можете увидеть эффект.

Добавьте, например, еще два соединения.

// new complexity
m1 -> m5 
b3 -> b1    

Теперь, чтобы новый результирующий граф выглядел лучше, попробуйте следующее.

 { rankdir=LR ; rank=same ; m1; m2; m3; m4; m5 }
 { rankdir=LR ; rank=same ; b1; b2; b3 }

subgraph master { 
m1 -> m2 -> m3 -> m4 -> m5
}

subgraph branch { 
m2 -> b1 // branch from master
b1 -> b2 -> b3
b3 -> m4 // merge into master
}


// new complexity
m1 -> m5 
b3 -> b1    
...