2017-03-29 97 views
1

我在解決這個問題時遇到了一些問題,我有一個數據框,我需要從中創建一個圖形。用相關矩陣創建圖形

我的數據幀的樣子:

A =pd.DataFrame([(1, 0.3, 0.4, 0.7), 
        (0.3, 1, 0.9, 0.2), 
        (0.4, 0.9, 1, 0.1), 
        (0.7, 0.2, 0.1, 1) 
        ], columns=['a', 'b', 'c', 'd'], index=['a', 'b', 'c', 'd']) 
    np.fill_diagonal(A.values, 0) 
>>> A 
    a b c d 
a 0.0 0.3 0.4 0.7 
b 0.3 0.0 0.9 0.2 
c 0.4 0.9 0.0 0.1 
d 0.7 0.2 0.1 0.0 

我想創建與此數據的圖表。有四個節點:a,b,c,d,節點之間的距離由矩陣給出,例如節點a-b = 0.3之間的距離(因爲它是一個相互重疊的矩陣值)。

謝謝!

我創造了這個功能,邊緣的值存儲爲一個字典(我不知道這是否會是最好的想法):

def edges(matr): 
    edge = {} 
    for m in matr.columns: 
     for n in matr.index: 
      a,b = m,n 
      if a!= b: 
       x = matr.at[m, n] 
       edge[m,n] = float("{0:.4f}".format(x)) 
    return edge 

edges(A) 

>>> edges(A) 
{('a', 'b'): 0.3, 
('a', 'c'): 0.4, 
('a', 'd'): 0.7, 
('b', 'a'): 0.3, 
('b', 'c'): 0.9, 
('b', 'd'): 0.2, 
('c', 'a'): 0.4, 
('c', 'b'): 0.9, 
('c', 'd'): 0.1, 
('d', 'a'): 0.7, 
('d', 'b'): 0.2, 
('d', 'c'): 0.1} 

但由於AB是一樣的BA一些邊緣重複,我不知道如何刪除重複的值。 從這些數據我需要創建一個圖形/圖片。

謝謝!

+0

可能愚蠢的問題,n但什麼樣的圖形?一個特定的數據結構?照片? – doctorlove

+0

邊緣和距離的列表,並創建一個圖形/圖片。謝謝! – Mee

回答

0

創建圖片有多種方式。我會顯示graphviz。

首先,您的邊緣功能會將邊緣兩次添加(從說ab再回來),所以我們只需添加一次。

import graphviz as gv 

def edges(matr): 
    edge = {} 
    for m in matr.columns: 
     for n in matr.index: 
      a,b = m,n 
      if a > b: #only add edge once 
       x = matr.at[m, n] 
       edge[m,n] = float("{0:.4f}".format(x)) 
    return edge 

if __name__ == '__main__': 
    A =pd.DataFrame([(1, 0.3, 0.4, 0.7), 
       (0.3, 1, 0.9, 0.2), 
       (0.4, 0.9, 1, 0.1), 
       (0.7, 0.2, 0.1, 1) 
       ], columns=['a', 'b', 'c', 'd'], index=['a', 'b', 'c', 'd']) 
    np.fill_diagonal(A.values, 0) 

    e = edges(A) 
    g = gv.Graph(format="png") 
    for k, v in e.iteritems(): 
     g.edge(k[0], k[1], len=str(v)) 

    print str(g) 

這給你一個graphviz的格式

graph { 
     b -- a [len=0.3] 
     c -- a [len=0.4] 
     c -- b [len=0.9] 
     d -- a [len=0.7] 
     d -- c [len=0.1] 
     d -- b [len=0.2] 
} 

你可以將其發送到graphviz的工具外,如果你把它保存到一個文件.dot,例如在python中使用dot -Tps g.dot -o g.png或做g.render('filename', view = True)

Generated graph

+0

謝謝你修改函數edges(),現在它做我需要的。但是'for k,v in e.iteritems():g.edge(k [0],k [1],len = str(v))'給出了一個錯誤:NameError:name'e'沒有被定義。謝謝!! – Mee

+0

哦 - 當然 - 你需要'e =邊緣(A)' - 編輯答案 – doctorlove

+0

'e.iteritems()'不適用於我,所以我將它改爲'e.items()',現在正在工作。謝謝您的回答!! – Mee