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