2017-03-29 2 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의 4 개의 노드가 있으며 노드 사이의 거리는 행렬 a-b = 0.3 (예 : 행렬 값이 중복되므로) 사이의 거리와 같이 행렬에 의해 주어집니다.

감사합니다.

I (즉 될 경우 나도 몰라 좋은 생각을)를 딕셔너리로 ​​가장자리의 값을 저장하기 위해이 기능을 만들었습니다

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 이후 일부 가장자리 바과 동일 반복되는 값을 제거하는 방법을 알아낼 수 없습니다. 그리고 그 데이터에서 그래프/그림을 만들어야합니다.

감사합니다.

+0

아마 바보 같은 질문 n 그러나 그래프의 어떤 종류의? 특정 데이터 구조? 사진? – doctorlove

+0

가장자리 및 거리 목록 및 그래프/그림 만들기. 감사! – Mee

답변

0

그림을 만드는 다양한 방법이 있습니다. graphviz를 보여 드리겠습니다.

먼저 가장자리 기능을 사용하여 가장자리를 두 번 더 추가합니다 (예 : a에서 b까지). 한 번 추가하면됩니다.

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] 
} 

당신이 .dot 파일에 저장하는 경우는 외부은 GraphVIZ 도구로 보낼 수 있습니다, 예를 제공합니다 dot -Tps g.dot -o g.png 또는 g.render('filename', view = True)을 python으로 작성하십시오.

Generated graph

+0

함수 edges()를 수정 해 주셔서 감사합니다. 이제 필요한 항목을 수행합니다. 그러나 'e.iteritems (k)의 경우 : g.edge (k [0], k [1], len = str (v))'는 오류를 발생시킵니다. NameError : name 'e'가 정의되지 않았습니다. 고맙습니다!! – Mee

+0

오 - 물론 - 당신은'e = edges (A)'를 필요로합니다 - editted 대답 – doctorlove

+0

'e.iteritems()'가 작동하지 않아 e.items()로 바뀌 었습니다. 답변 주셔서 감사합니다!! – Mee