You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:50:56