NetworkX图在Basemap上无法绘制边的问题排查
问题:Basemap上NetworkX网络图节点显示但边不显示
我参照示例在Basemap上绘制NetworkX生成的网络图,单独绘制网络图正常,但运行代码后仅显示Basemap,无节点和边:
lat = np.asarray(list(stations['latitude'])) lon = np.asarray(list(stations['longitude'])) plt.figure(figsize = (10,9)) m = Basemap(llcrnrlon=lon_min, llcrnrlat=lat_min, urcrnrlon=lon_max, urcrnrlat=lat_max, #lat_0=(lat_max - lat_min)/2, #lon_0=(lon_max - lon_min)/2, projection='merc', resolution = 'f',) mx, my = m(stations['latitude'].values, stations['longitude'].values) pos = {} for count, elem in enumerate (stations['station']): pos[elem] = (mx[count], my[count]) nx.draw_networkx_nodes(G = graph, pos = pos, nodelist = graph.nodes(), #node_color = carac['counts'], alpha = 0.8, #node_size = carac['counts']/5 ) nx.draw_networkx_edges(G = graph, pos = pos, edge_color='g', alpha=0.2, arrows = False, #width=list(widths.values()) ) m.drawcoastlines() m.drawstates() m.fillcontinents(lake_color='cornflowerblue') m.drawmapboundary(fill_color='royalblue') m.drawrivers() plt.tight_layout() plt.show()
我查阅过相关解答未找到明确原因,注意到mx、my数组并非stations数据框中的实际经纬度,但调整输入方式后结果一致。
更新:
将mx, my的输入改为先经度后纬度:
mx, my = m(stations['longitude'].values, stations['latitude'].values)
节点已显示,但边仍不存在。
解决方法
1. 验证节点名称匹配性
NetworkX绘制边时,要求pos字典的键与图G中边的两端节点完全一致(包括大小写、空格、格式细节)。如果两者存在差异,边会因找不到对应坐标而不显示。可以用以下代码排查:
# 检查图中节点是否都在pos字典内 missing_nodes = [node for node in graph.nodes() if node not in pos] print("Pos字典缺失的节点:", missing_nodes) # 检查每条边的节点是否都有对应坐标 for u, v in graph.edges(): if u not in pos or v not in pos: print(f"边({u}, {v})的节点无对应坐标")
2. 调整图层绘制顺序
当前代码先画网络图再画Basemap元素,可能导致Basemap的填充层覆盖了边。把网络图绘制移到Basemap元素之后:
plt.figure(figsize = (10,9)) m = Basemap(llcrnrlon=lon_min, llcrnrlat=lat_min, urcrnrlon=lon_max, urcrnrlat=lat_max, projection='merc', resolution = 'f',) # 先绘制Basemap基础元素 m.drawcoastlines() m.drawstates() m.fillcontinents(lake_color='cornflowerblue') m.drawmapboundary(fill_color='royalblue') m.drawrivers() # 转换坐标并构建pos字典 mx, my = m(stations['longitude'].values, stations['latitude'].values) pos = {} for count, elem in enumerate (stations['station']): pos[elem] = (mx[count], my[count]) # 最后绘制网络图 nx.draw_networkx_nodes(G = graph, pos = pos, nodelist = graph.nodes(), alpha = 0.8) nx.draw_networkx_edges(G = graph, pos = pos, edge_color='g', alpha=0.2, arrows = False) plt.tight_layout() plt.show()
3. 调整边的视觉参数
当前边的透明度alpha=0.2过低,绿色edge_color='g'也可能和背景颜色过于接近,导致视觉上无法分辨。可以临时调高透明度(比如alpha=0.5)或更换鲜艳颜色(比如edge_color='red')测试是否显示。
内容的提问来源于stack exchange,提问作者Dizzy
相关产品推荐
相关产品推荐

