Python在graphviz中改变节点的位置

时间:2017-04-18 17:12:21

标签: python position graphviz

我使用graphviz在python中绘制图形。我得到的图片几乎就像我想要的那样,但有一个例外:(某些)节点的位置不像我喜欢的那样。这是我的例子:

import graphviz as gv

A=[[1],[2,3,5,7],[4,6,9,10],[8]]
G=gv.Digraph(format='png',filename='Test')
for k in range(len(A)-1):
    for l in A[k]:
        G.node(str(l))
        for m in A[k+1]:
            if m%l==0:
                G.edge(str(l),str(m))
G.view()

这就是结果:

enter image description here

我的问题是我希望相同等级的节点按幅度排序,以便" 2"是排名1的最左边的节点(从排名0开始)," 4"是等级2的最左边的节点,等等。

感谢您的回答!

马丁

1 个答案:

答案 0 :(得分:2)

好吧,似乎我自己找到了答案。实际上,我使用了已经存在的post的方法以及可以直接创建一个带有python的.dot文件的事实,该文件的灵感来自Collatz-conjecture上的维基百科页面。最后但并非最不重要的,偶然的,我发现在安装graphviz时,我还安装了gvedit,我可以选择布局引擎,正如上面的帖子所暗示的,它必须是fdp或neato(它们都适用于我) 。这是我的解决方案:

A=[[1],[2,3,5,7],[4,6,9,10],[8]]

dotfile = file('image.dot', 'w')
dotfile.write('Digraph{\n')
for k in range(len(A)):
    for l in range(len(A[k])):
        dotfile.write(str(A[k][l])+'[pos="'+str(l)+',-'+str(k)+'!"];\n')
for k in range(len(A)-1):
    for l in A[k]:
        for m in A[k+1]:
            if m%l==0:
                dotfile.write(str(l)+'->'+str(m)+';\n')
dotfile.write('}\n')
dotfile.close()

ordered