2012-08-03 30 views
11

todavía soy un principiante con NetworkX Quiero añadir varios tipos de nodos en una posición diferente, he utilizado el siguiente códigoadd_node NetworkX con la posición específica

pos = {0: (40, 20), 1: (20, 30), 2: (40, 30), 3: (30, 10)} 
X=nx.Graph() 
nx.draw_networkx_nodes(X,pos,node_size=3000,nodelist=[0,1,2,3],node_color='r') 

pero cuando quiero acceder a la gráfica X, si escribo X.node, devuelve una lista vacía y si deseo agregar más nodos, debo establecer sus posiciones al principio usando pos dictionary.

¿Cómo puedo añadir nodos a un gráfico en un lugar x e y específica utilizando add_node()

Respuesta

19

No estoy completamente seguro de lo que quiere lograr, pero interpretarlo como desea agregar nodos al gráfico, dibujarlos en las posiciones deseadas y aún así poder acceder a ellos en el objeto gráfico.

Dado que no agrega los nodos de la gráfica, que sería un buen comienzo:

X.add_nodes_from(pos.keys()) 

Entonces no tiene que especificar la lista de nodos en la elaboración de la gráfica, y que por lo tanto no es necesario cambiar el código en dos lugares diferentes cuando se agregan nuevos nodos.

Si desea que la posición del nodo como un atributo del nodo, se puede hacer eso también:

for n, p in pos.iteritems(): 
    X.node[n]['pos'] = p 

Ten en cuenta que estas posiciones no serán utilizadas como la posición de la hora de elaborar el gráfico, tiene que establecerse de forma explícita. A continuación, podría dibujar y visualizar el gráfico:

nx.draw(X, pos) 
plt.show() 

el supuesto de que usted hizo la importación from matplotlib import pyplot as plt.

+2

Y para que quede claro, las posiciones especificadas en el punto de venta son los mismos (x, y) coordenadas pasadas a axes.scatter, por lo que añadir es como hacia la derecha xy arriba y. – dmonopoly

+0

¡Respuesta realmente útil, muchas gracias! ¿Existe una función de networkx para calcular la distancia euklidic entre dos nodos? – fuuman

+0

@fuuman Podría llegar tarde con este, pero hasta donde sé, no hay una función directa para calcular la distancia euclidiana entre dos nodos. Como referencia, podría usar esta respuesta que me fue dada hace un tiempo: http://stackoverflow.com/questions/36330642/python-edge-length-distribution-of-a-regular-network?answertab=active# tab-top – FaCoffee

23

Puede usar el siguiente enfoque para establecer posiciones de nodo individuales y luego extraer el diccionario "pos" para usar al dibujar.

In [1]: import networkx as nx 

In [2]: G=nx.Graph() 

In [3]: G.add_node(1,pos=(1,1)) 

In [4]: G.add_node(2,pos=(2,2)) 

In [5]: G.add_edge(1,2) 

In [6]: pos=nx.get_node_attributes(G,'pos') 

In [7]: pos 
Out[7]: {1: (1, 1), 2: (2, 2)} 

In [8]: nx.draw(G,pos) 

ACTUALIZACIÓN

dibujo

enter image description here

Cuestiones relacionadas