Graphviz:如何使子图节点在一条直线上排列?

10

我正在尝试使用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
    }
}

Graphviz diagram

如何设置属性,使得子图内所有节点(属于同一枝干)都在一条直线上?


你真的需要在布局中使用子图吗? - marapet
@marapet 不是的:那只是尝试设置那组节点的布局。 - acorello
2个回答

17

最简单的解决方法是将分支和合并边的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中强制“主线”节点成为一条直线(或其它替代方案)


@Christopher Mahan 请查看链接的问题,以了解使用“group”属性的替代解决方案。 - marapet

3

您可以使用属性设置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    

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接