2012-11-22 3 views
15

거리를 스케치 된 네트워크의 가장자리와 선과 열의 노드가되는 큰 거리 행렬의 2D 네트워크로 플롯/스케치 (matplotlib 또는 기타 파이썬 라이브러리)하려고합니다.거리 매트릭스에서 그래프 또는 네트워크 그리기?

DistMatrix = 
[  'a', 'b',  'c', 'd'], 
['a', 0,  0.3, 0.4, 0.7], 
['b', 0.3, 0,  0.9, 0.2], 
['c', 0.4, 0.9, 0,  0.1], 
['d', 0.7, 0.2, 0.1, 0] ] 

내가 스케치 검색 오전/플롯 차원 네트워크에서 예 (큰 : 열 및 행의 천)의 거리 매트릭스 : 노드 'A'는 0.3의 에지 깊이 'B'를 노드에 연결되어, 노드 'c'와 'd'는 가장자리 깊이 0.1로 묶일 것입니다. 그런 네트워크의 스케치/그래픽 투영을 얻으 려 할 때 사용할 수있는 도구/라이브러리는 무엇입니까 (거리 행렬을 수치가 낮은 행렬로 변환 할 수 있습니까?). (pandas, matplotlib, igraph, ...?) 그리고 일부는 그렇게 빨리 할 수 ​​있습니다 (나는 자기 Tkinter 함수를 정의하지 않을 것입니다 ;-))? 들어오는 답변에 감사드립니다.

+0

은 이론적으로,이 특정 거리 행렬 불가능 될 수 산출한다. 상상해보십시오. 모든 항목이 1 인 4 x 4 거리 행렬입니다. 이것은 3 차원 심플 렉스를 정의합니다. 이 그래프를 등각 투영으로 2 차원으로 퍼갈 수있는 방법이 없습니다. 이 경우 프로그램에서 무엇을해야합니까? – Turion

+0

그래, 그래서 "가장자리 길이"하지만 "두 노드를 연결하는 가장자리 깊이 – sol

답변

21

graphviz 프로그램을 neato은 모서리 길이를 고려하여을 시도합니다. doug shows a way이 같은 networkx를 사용하여 neato을 활용하기 :

import networkx as nx 
import numpy as np 
import string 

dt = [('len', float)] 
A = np.array([(0, 0.3, 0.4, 0.7), 
       (0.3, 0, 0.9, 0.2), 
       (0.4, 0.9, 0, 0.1), 
       (0.7, 0.2, 0.1, 0) 
       ])*10 
A = A.view(dt) 

G = nx.from_numpy_matrix(A) 
G = nx.relabel_nodes(G, dict(zip(range(len(G.nodes())),string.ascii_uppercase)))  

G = nx.drawing.nx_agraph.to_agraph(G) 

G.node_attr.update(color="red", style="filled") 
G.edge_attr.update(color="blue", width="2.0") 

G.draw('/tmp/out.png', format='png', prog='neato') 

enter image description here

+0

내 요구에 맞게 제안 된 코드를 시도했는데 (A.view 제거), 7 노드조차도 작동하지 않았습니다. 올바른지. 무엇이 잘못되었을 수 있습니까? graphviz 2.36을 사용하고 있습니다. – Picarus

+1

이 경우에는 '모듈'객체에 'to_agraph'속성이 없습니다. 수정하려면 http://stackoverflow.com/questions/35279733/what -could-cause-networkx-pygraphviz-to-work-fine-alone-but-not-together 대신'nx.drawing.nx_agraph.to_agraph'를 사용합니다. – kungfujam

+0

@kungfujam : 업데이트 해 주셔서 감사합니다. – unutbu

14

networkx 패키지를 사용할 수 있습니다.이 문제는 이러한 종류의 문제와 완벽하게 작동합니다. 다음과 같이 간단한 NumPy와 배열을 제거하기 위해 매트릭스를 조정합니다

DistMatrix =array([[0,  0.3, 0.4, 0.7], 
[0.3, 0,  0.9, 0.2], 
[0.4, 0.9, 0,  0.1], 
[0.7, 0.2, 0.1, 0] ]) 

는 networkx을 가져 당신이 그래프의 가중 버전을 그리려는 경우가

import networkx as nx 
G = G=nx.from_numpy_matrix(DistMatrix) 
nx.draw(G) 

, 당신은 지정해야 사용 각 가장자리의 색상은 (적어도, 나는 그것을 할 수있는 더 자동화 된 방법을 찾을 수 없습니다) :

nx.draw(G,edge_color = [ i[2]['weight'] for i in G.edges(data=True) ], edge_cmap=cm.winter)