我有两个数据框,可用于在Python中使用networkx创建图形。数据框df1(节点坐标)和df2(边缘信息)如下所示:
location x y
0 The Wall 145 570
2 White Harbor 140 480
和
location x y
56 The Wall Winterfell 259
57 Winterfell White Harbor 247
这是我为尝试绘制图形而实现的代码:
plt.figure()
G=nx.Graph()
for i, x in enumerate(df1['location']):
G.add_node(x, pos=(df1['x'][i], df1['y'][i]))
for x, x2, w in zip(df2['location'], df2['x'], df2['y']):
G.add_edge(x, x2, weight=w)
plt.figure(figsize=(15,15))
pos = nx.get_node_attributes(G, 'pos')
weights = nx.get_edge_attributes(G, 'weight')
nx.draw(G, pos=pos, node_size=40, with_labels=True, fontsize=9)
nx.draw_networkx_edge_labels(G, pos=pos, edge_labels=weights)
plt.show()
我之前运行了几次,它似乎可以运行,但是现在重新打开jupyter笔记本并再次运行它后,它将无法运行。我主要有两个主要问题。
nx.draw(G, pos=pos, node_size=40, with_labels=True, fontsize=9)
行,则将显示我的图形,但是即使with_labels设置为true,也不会显示任何标签。nx.draw_networkx_edge_labels(G, pos=pos, edge_labels=weights)
现在向我显示错误无法将序列乘以'float'类型的非整数 我已经看了几个小时了,有什么想法我似乎无法解决?
编辑: 如果从nx.draw中排除pos = pos,我可以显示标签,但是如果包含它,它将无法工作
答案 0 :(得分:1)
问题是您没有为节点pos
指定任何Winterfell
属性,然后当您尝试在draw_networkx_edge_labels
中访问它时找不到它。
如果尝试为其赋予位置属性,请说:
location x y
0 TheWall 145 570
1 Winterfell 142 520
2 WhiteHarbor 140 480
然后可以正确访问所有节点的属性,并准确绘制网络:
plt.figure()
G=nx.Graph()
df1 = df1.reset_index(drop=True)
df2 = df2.reset_index(drop=True)
for i, x in enumerate(df1['location']):
G.add_node(x, pos=(df1.loc[i,'x'], df1.loc[i,'y']))
for x, x2, w in zip(df2['location'], df2['x'], df2['y']):
G.add_edge(x, x2, weight=w)
plt.figure(figsize=(15,15))
pos = nx.get_node_attributes(G, 'pos')
weights = nx.get_edge_attributes(G, 'weight')
nx.draw(G, pos=pos, node_size=40, with_labels=True, fontsize=9)
nx.draw_networkx_edge_labels(G, pos=pos, edge_labels=weights)
plt.show()