2013-05-15 53 views
11

我以.json文件的形式将我的Facebook数据导入到了我的计算机上。该数据的格式为:节点大小取决于NetworkX上的节点度数

{"nodes":[{"name":"Alan"},{"name":"Bob"}],"links":[{"source":0,"target:1"}]} 

然后,我使用此功能:

def parse_graph(filename): 
""" 
Returns networkx graph object of facebook 
social network in json format 
""" 
G = nx.Graph() 
json_data=open(filename) 
data = json.load(json_data) 
# The nodes represent the names of the respective people 
# See networkx documentation for information on add_* functions 
G.add_nodes_from([n['name'] for n in data['nodes']]) 
G.add_edges_from([(data['nodes'][e['source']]['name'],data['nodes'][e['target']]['name']) for e in data['links']]) 
json_data.close() 
return G 

启用该上传.json文件中可以使用NetworkX的曲线图。如果我发现了节点的程度,我知道如何使用的唯一方法是:

degree = nx.degree(p) 

p是我所有的朋友的图表。现在,我想绘制图表,使节点的大小与该节点的大小相同。我该怎么做呢?

使用:

nx.draw(G,node_size=degree) 

没有工作,我想不出其他的方法。

回答

21

nx.degree(p)返回一个字典,而node_size keywod argument需要一个标量或一个数组的大小。您可以使用字典nx.degree回报这样的:

import networkx as nx 
import matplotlib.pyplot as plt 

g = nx.Graph() 
g.add_edges_from([(1,2), (2,3), (2,4), (3,4)]) 

d = nx.degree(g) 

nx.draw(g, nodelist=d.keys(), node_size=[v * 100 for v in d.values()]) 
plt.show() 

enter image description here

+0

很好的回答!正如我在下面提到的那样,如果数据具有用户想要显示的零度节点,则节点大小应该添加一些值,例如:在d.values()中v的[[(v + 1)* 100) ]',以便零度节点出现。 – Tchotchke

1

@ miles82提供了一个很好的答案。但是,如果您已经使用类似G.add_nodes_from(nodes)的方式将节点添加到图形中,那么我发现d = nx.degree(G)可能不会以与节点相同的顺序返回度数。

号楼离前面的回答,您可以稍微修改解决方案,以保证度是正确的顺序:

d = nx.degree(G) 
d = [(d[node]+1) * 20 for node in G.nodes()] 

注意d[node]+1,这将确保零度的节点添加到图表。