网络图与Plotly

时间:2017-03-01 10:08:51

标签: python plot graph plotly

学习通过教程绘制python图: https://plot.ly/ipython-notebooks/network-graphs/

由于Nodes只能使用数字形式(如果错误会更正),我已将我的节点替换为G2dd2b14820721251的值完成反向映射以在图的后期使用

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'        

我与上述教程中提到的要求完全相同,node_info会将我的G2dd2b1482072125值反向映射为数字node_to_nmbr_dict

有人可以指出我在绘制图表时出错的地方吗?

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] :  {}

1 个答案:

答案 0 :(得分:1)

你有一个&#34; off-by-one&#34; nx.random_geometric_graph编号导致的错误 节点从0开始,而edge_list(显然)编号节点从1开始。

例如,

In [80]: G = nx.random_geometric_graph(3, 1)

In [81]: G.nodes()
Out[81]: [0, 1, 2]

到目前为止,这么好。每个节点都有一个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)

糟糕!现在,在没有3的情况下引入了新节点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, {})]

因此,当G.node[edge[1]]['pos']为3时,edge[1]会引发KeyError。

可以通过从edge_list中的每个节点值中减去1来修复代码(从而将节点重新编号为从0开始):

edge_list = [(0, 1), (1, 2), (2, 0)]