2013-05-15 5 views
11

Ich habe meine Facebook-Daten in Form einer .json-Datei auf meinen Computer importiert. Die Daten sind im Format:Knotengröße abhängig vom Knotengrad auf NetworkX

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

Dann benutze ich diese Funktion:

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 

diese .json Datei zu aktivieren, um ein Diagramm auf NetworkX verwendet werden. Wenn ich den Grad der Knoten finden, die einzige Methode, ich weiß, wie zu verwenden ist:

degree = nx.degree(p) 

Wo p ist die grafische Darstellung aller meiner Freunde. Jetzt möchte ich den Graphen so plotten, dass die Größe des Knotens mit dem Grad dieses Knotens übereinstimmt. Wie mache ich das?

Verwendung:

nx.draw(G,node_size=degree) 

hat nicht funktioniert und ich kann nicht von einer anderen Methode denken.

Antwort

21

nx ° (p) gibt ein Diktat zurück, während node_size keywod argument ein Skalar oder ein Array von Größen benötigt. Sie können die dict nx.degree Erträge wie folgt verwenden:

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

Große Antwort! Wie ich unten erwähne, wenn die Daten Null-Grad-Knoten haben, die ein Benutzer zeigen möchte, sollte die Knotengröße einen zusätzlichen Wert haben, wie: '[(v + 1) * 100 für v in d.values ​​() ] ', so dass die Null-Grad-Knoten angezeigt werden. – Tchotchke

1

@ miles82 eine große Antwort zur Verfügung gestellt. Wenn Sie die Knoten jedoch bereits mit etwas wie G.add_nodes_from(nodes) zu Ihrem Diagramm hinzugefügt haben, habe ich festgestellt, dass d = nx.degree(G) die Grad nicht in derselben Reihenfolge wie Ihre Knoten zurückgeben kann.

die vorherige Antwort Gebäude aus, können Sie die Lösung ändern leicht die Grade sind in der richtigen Reihenfolge zu gewährleisten:

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

Notiere die d[node]+1, die sicher sein, dass Knoten vom Grad Null werden die zugegebene Diagramm.