NoobEditor
NoobEditor

Reputation: 15921

Network Graphs with Plotly

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

Answers (1)

unutbu
unutbu

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

Related Questions