学习通过教程绘制python图: https://plot.ly/ipython-notebooks/network-graphs/
由于Nodes
只能使用数字形式(如果错误会更正),我已将我的节点替换为G2dd2b1482072125
到1
的值完成反向映射以在图的后期使用
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] : {}
答案 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)]