2012-11-22 62 views
15

我想绘制/草图(matplotlib或其他python库)一个大距离矩阵的二维网络,其中距离将是草绘网络的边缘以及线和列的节点。从距离矩阵中绘制图形或网络?

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。 我可以使用哪些工具/库(距离矩阵可以转换成numpy矩阵)以获得这种网络的草图/图形投影? (熊猫,matplotlib,igraph,...?)和一些导致做到这一点(我不会定义自己的Tkinter函数来做到这一点;-))? 感谢您收到的答案。

+0

在理论上,这可能是不可能的一定的距离矩阵。想象一下,例如一个包含所有条目的4×4距离矩阵1.这定义了一个三维单形。没有办法将这个图嵌入到两个维度中。该计划在这种情况下应该做什么? – 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)