Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

networkx add_node with specific position

I am still a beginner with networkx I want to add multiple types of nodes in different position, I used the following code

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

but when I want to access the Graph X , if I type X.node it returns an empty list and if I want to add more nodes I have to set their positions in the beginning using pos dictionary.

How can I add nodes to a graph in a specific location x and y using add_node()

like image 860
NBaz Avatar asked Aug 03 '12 23:08

NBaz


2 Answers

You can use the following approach to set individual node positions and then extract the "pos" dictionary to use when drawing.

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)

UPDATE

Add drawing

enter image description here

like image 109
Aric Avatar answered Oct 30 '22 14:10

Aric


I'm not completely sure what you want to accomplish, but I think you want to add nodes to the graph, draw them in the wanted positions and still be able to access them in the graph object.

Since you don't add the nodes to the graph, that would be a start:

X.add_nodes_from(pos.keys())

Then you don't have to specify the node list when drawing the graph, and thus you don't have to change the code in two different places when adding new nodes.

If you want the position of the node as a node attribute, you could do that as well:

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

Just note that these positions won't be used as the position when drawing the graph, it has to be set explicitly. You could then draw and display the graph with:

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

assuming that you did the import from matplotlib import pyplot as plt.

like image 32
Maehler Avatar answered Oct 30 '22 12:10

Maehler