在graphviz点有向图中,如何中断较宽的布局(rankdir LR)

时间:2019-01-10 17:09:35

标签: 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')
graph.node('e', 'E')
graph.node('f', 'F')
...

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

输出:

all items in one row

但是我想要(或类似):

items arranged in two rows with keeping the connection

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

作为一个工作环境,我试图减少ranksep,但这只会使它适用于更多项目。

我也进行了很多搜索,但找不到合适的答案。 朝相似方向发展的未解决问题是: graphviz plot too wide。 对于其他相关问题suggested answer was to use invisible elements,但这在这里也不起作用。


更新: 我已经根据@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'})

不幸的是,结果现在看起来像这样(样式为“虚线”而不是“ invis”,以提高可见度): enter image description here

'rank':'same'似乎没有任何改变。同样适用于节点A和D。

1 个答案:

答案 0 :(得分:2)

这应该是注释而不是答案,因为它不能解决python问题,我想您也在寻找更“自动”的东西-但也许它提供了一些想法;并且没有其他人在捡它,这是一个纯图形的建议:

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;
}

收益

enter image description here