2017-04-18 35 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