2017-04-18 310 views
0

我正在使用graphviz在python中绘制图形。我得到的照片几乎和我想要的一样,只有一个例外:(某些)节点的位置并不像我希望的那样。这是我的例子:Python在graphviz中更改节点的位置

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的最左节点,等等。

感谢您的回答!

Martin

+0

我要补充一点,我知道已经有已经问围绕这个话题计算器几个类似的问题。不过,就我而言,这些问题都不符合我的需求。如果有人发现一个已经回答了的问题,我会很高兴,它会以某种方式帮助我...... ^^ –

+0

呃...好吗?有人在吗?^^ –

回答

1

好吧,似乎我自己找到了答案。事实上,我使用了这个已存在的post的方法,以及可以直接用python创建一个.dot文件的事实,这个文件受到了Wikipedia页面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