在graphviz点有向图中,如何打破宽布局(rankdir LR)

在graphviz点有向图中,如何打破宽布局(rankdir LR),graphviz,dot,Graphviz,Dot,使用python,我试图生成一个长图,其中始终有一个节点指向下一个节点。这最终会产生一长串节点(rankdir-LR)。但是我想在某个宽度、数量或节点后将其打断。如何才能做到这一点 graph = gv.Digraph(format='svg') graph.graph_attr.update({'rankdir': 'LR'}) graph.node('a', 'A') graph.node('b', 'B') graph.node('c', 'C') graph.node('d', 'D'

使用python,我试图生成一个长图,其中始终有一个节点指向下一个节点。这最终会产生一长串节点(rankdir-LR)。但是我想在某个宽度、数量或节点后将其打断。如何才能做到这一点

graph = gv.Digraph(format='svg')
graph.graph_attr.update({'rankdir': 'LR'})

graph.node('a', 'A')
graph.node('b', 'B')
graph.node('c', 'C')
graph.node('d', 'D')
graph.node('e', 'E')
graph.node('f', 'F')
...

graph.edges(['ab', 'bc', 'cd', 'de', 'ef', ...])
输出:

但是我想要(或类似):

我尝试使用大小,但这只会放大整个图形

作为一名工作狂,我试图减少ranksep,但这只会让更多的物品变得更好

我也搜索了很多,但没有找到合适的答案。 一个类似方向的未回答问题是: . 对于其他相关问题,但这在这里也不起作用


更新: 我根据@vaettchen的评论修改了边缘代码:

graph.edge('a', 'b', None, {'weight':'5'})
graph.edge('b', 'c', None, {'weight':'5'})
graph.edge('d', 'e', None, {'weight':'5'})
graph.edge('e', 'f', None, {'weight':'5'})

graph.edge('c', 'd', None, {'weight':'1'})
graph.edge('a', 'd', None, {'style':'dashed', 'rank':'same'})
不幸的是,结果现在看起来是这样的(为了更好的可见性,样式是“虚线”而不是“Invi”):


“等级”:“相同”似乎不会改变任何东西。同样,当应用于节点A和D时。

这应该是一个注释,而不是答案,因为它没有解决python问题,我猜您也在寻找更“自动”的东西,但可能它给出了一些想法;由于没有其他人接受,这里有一个纯粹的graphviz建议:

digraph so 
{
    // graph attributes
    rankdir = LR;       // horizontal graph
    splines = ortho     // edges with "corners"

    // default/initial node style
    node[ shape = box ];

    // nodes where the "new lines" begin
    // connected invisibly to keep them in order
    { rank = same; A ->  E ->  I[ style = invis ] }

    // nodes that are to be in one line
    // extra weight needed to keep the edges straight
    edge[ weight = 5 ];
    A -> B -> C -> D;
    E -> F -> G -> H;
    I -> J -> K -> etc;

    // edges connecting the graph elements over the lines
    edge[ weight = 1 ];
    D -> E;
    H -> I;
}
屈服


谢谢。我会检查它,如果它能正常工作,我会在这里发布python语法。我更改了我的边缘,但是它没有按预期显示(将更新问题),这很奇怪。当
A
D
处于相同的等级时,它们必须在图形中处于相同的高度-这就是
rank=same
的全部目的。可能是Python中的语法问题-如何/在何处放置
rank=same
指令?