2013-05-15 58 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,這將確保零度的節點添加到圖表。