我正在尝试使用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,但这只会使它适用于更多项目。
我也进行了很多搜索,但找不到合适的答案。 朝相似方向发展的未解决问题是: 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”,以提高可见度):
'rank':'same'似乎没有任何改变。同样适用于节点A和D。
答案 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;
}
收益