Reputation: 15921
Learning to plot python graph via tutorial : https://plot.ly/ipython-notebooks/network-graphs/
Since Nodes
can work only form of number (do correct if m wrong), i have replaced my nodes having values like G2dd2b1482072125
to 1
and done reverse mapping to use at later point of graph
import plotly.plotly as py
from plotly.graph_objs import *
import networkx as nx
node_to_nmbr_dict = {
'G2dd2b1482072125': 1,
'G2dd2b1482072126': 2,
'G2dd2b1482072127': 3
}
nmbr_to_node_dict = {
1: 'G2dd2b1482072125',
2: 'G2dd2b1482072126',
3: 'G2dd2b1482072127'
}
# create Graph object, with nodes = len(nmbr_to_node_dict), (i think!!)
G=nx.random_geometric_graph(len(nmbr_to_node_dict),1)
edge_list = [(1, 2), (2, 3), (3, 1)]
# Remove default edges created automatically
G.remove_edges_from(G.edges())
#add your own edges
G.add_edges_from(edge_list)
# Store position as node attribute data for random_geometric_graph and find node near center (0.5, 0.5)
pos=nx.get_node_attributes(G,'pos')
dmin=1
ncenter=0
for n in pos:
x,y=pos[n]
d=(x-0.5)**2+(y-0.5)**2
if d<dmin:
ncenter=n
dmin=d
p=nx.single_source_shortest_path_length(G,ncenter)
# Add edges as disconnected lines in a single trace and nodes as a scatter trace
edge_trace = Scatter(
x=[],
y=[],
line=Line(width=0.5,color='#888'),
hoverinfo='none',
mode='lines')
for edge in G.edges():
x0, y0 = G.node[edge[0]]['pos']
x1, y1 = G.node[edge[1]]['pos'] # <----- This here throws keys error
edge_trace['x'] += [x0, x1, None]
edge_trace['y'] += [y0, y1, None]
KeyError Traceback (most recent call last)
<ipython-input-96-077055af3467> in <module>()
1 for edge in G.edges():
2 x0, y0 = G.node[edge[0]]['pos']
----> 3 x1, y1 = G.node[edge[1]]['pos']
4 edge_trace['x'] += [x0, x1, None]
5 edge_trace['y'] += [y0, y1, None]
KeyError: 'pos'
I am exactly same requirement as mentioned in the above tutorial, node_info
would have my G2dd2b1482072125
values which have been reverse mapped with numbers in dicts node_to_nmbr_dict
Can some one point out exactly where am i going wrong in plotting the graph?
Termnial Dump:
In [108]: for i in G.nodes():
...: print "G.node : ", G.node
...: print "G.node[i] : ", G.node[i]
...: print "\n"
...:
G.node : {0: {'pos': [0.5509883914114821, 0.2750348146445808]}, 1: {'pos': [0.07961147691471337, 0.6834184588841679]}, 2: {'pos': [0.8659145315498231, 0.4056583698428097]}, 3: {}}
G.node[i] : {'pos': [0.5509883914114821, 0.2750348146445808]}
G.node : {0: {'pos': [0.5509883914114821, 0.2750348146445808]}, 1: {'pos': [0.07961147691471337, 0.6834184588841679]}, 2: {'pos': [0.8659145315498231, 0.4056583698428097]}, 3: {}}
G.node[i] : {'pos': [0.07961147691471337, 0.6834184588841679]}
G.node : {0: {'pos': [0.5509883914114821, 0.2750348146445808]}, 1: {'pos': [0.07961147691471337, 0.6834184588841679]}, 2: {'pos': [0.8659145315498231, 0.4056583698428097]}, 3: {}}
G.node[i] : {'pos': [0.8659145315498231, 0.4056583698428097]}
G.node : {0: {'pos': [0.5509883914114821, 0.2750348146445808]}, 1: {'pos': [0.07961147691471337, 0.6834184588841679]}, 2: {'pos': [0.8659145315498231, 0.4056583698428097]}, 3: {}}
G.node[i] : {}
Upvotes: 0
Views: 5628
Reputation: 880777
You have an "off-by-one" error caused by nx.random_geometric_graph
numbering
nodes starting at 0, while your edge_list
(apparently) numbering nodes starting at 1.
For example,
In [80]: G = nx.random_geometric_graph(3, 1)
In [81]: G.nodes()
Out[81]: [0, 1, 2]
So far, so good. Every node has a pos
:
In [82]: G.nodes(data=True)
Out[82]:
[(0, {'pos': [0.3530839410903017, 0.6066802744128065]}),
(1, {'pos': [0.8770904947229078, 0.642494748842952]}),
(2, {'pos': [0.286083277031809, 0.2958147129607025]})]
In [83]: edge_list = [(1, 2), (2, 3), (3, 1)]
In [84]: G.remove_edges_from(G.edges())
In [85]: G.add_edges_from(edge_list)
Oops! Now a new node 3
has been introduced without a pos
:
In [86]: G.nodes(data=True)
Out[86]:
[(0, {'pos': [0.3530839410903017, 0.6066802744128065]}),
(1, {'pos': [0.8770904947229078, 0.642494748842952]}),
(2, {'pos': [0.286083277031809, 0.2958147129607025]}),
(3, {})]
Hence, G.node[edge[1]]['pos']
can raise a KeyError when edge[1]
is 3.
Your code could be fixed by subtracting 1 from each node value in edge_list
(thus renumbering the nodes to start at 0):
edge_list = [(0, 1), (1, 2), (2, 0)]
Upvotes: 1