python python-2.7 social-networking networkx

python - Tamaño del nodo dependiente del grado del nodo en NetworkX



networkx layout (2)

Importé mis datos de Facebook a mi computadora en forma de un archivo .json. Los datos están en el formato:

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

Luego, uso esta función:

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

para habilitar este archivo .json para que se use un gráfico en NetworkX. Si encuentro el grado de los nodos, el único método que sé usar es:

degree = nx.degree(p)

Donde p es la gráfica de todos mis amigos. Ahora, quiero trazar la gráfica de manera que el tamaño del nodo sea el mismo que el grado de ese nodo. ¿Cómo hago esto?

Utilizando:

nx.draw(G,node_size=degree)

No funcionó y no puedo pensar en otro método.


@ miles82 proporcionó una gran respuesta. Sin embargo, si ya ha agregado los nodos a su gráfica usando algo como G.add_nodes_from(nodes) , entonces encontré que d = nx.degree(G) puede no devolver los grados en el mismo orden que sus nodos.

A partir de la respuesta anterior, puede modificar la solución ligeramente para asegurarse de que los grados estén en el orden correcto:

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

Tenga en cuenta el d[node]+1 , que se asegurará de que se agreguen nodos de grado cero al gráfico.


nx.degree (p) devuelve un dict, mientras que el argumento node_size keywod necesita un escalar o una matriz de tamaños. Puede utilizar el dict nx.degree devuelve de esta manera:

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()