Basemap 3D绘图报错求助:NotImplementedError与AttributeError问题
解决Basemap 3D绘图中的两个报错问题
问题原因
这两个错误确实是环境版本兼容性导致的:
NotImplementedError:Basemap默认会把轴的aspect设置为'equal',但新版matplotlib的3D轴(Axes3D)仅支持'aspect=auto',二者冲突引发报错。AttributeError:Basemap的drawcoastlines()/drawcountries()返回的是2D的LineCollection对象,而新版matplotlib的3D轴要求集合对象必须实现do_3d_projection方法,该对象不满足要求。
另外需要注意:Basemap已停止维护,官方推荐使用Cartopy替代,但如果需要继续用Basemap,可以通过以下方式修复。
修复方案
1. 禁用Basemap的强制aspect设置
初始化Basemap时添加fix_aspect=False参数,避免强制设置轴aspect为'equal'。
2. 手动转换路径为3D线条
不要直接用add_collection3d添加LineCollection,而是提取路径数据,逐个转换成3D线条绘制。
修改后的完整代码
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from mpl_toolkits.basemap import Basemap # 初始化Basemap时禁用强制aspect设置 map = Basemap(fix_aspect=False) fig = plt.figure() ax = Axes3D(fig) # 可选:调整视角参数 # ax.azim = 270 # ax.elev = 90 # ax.dist = 5 # 绘制海岸线:提取路径并转为3D线条 for path in map.drawcoastlines(linewidth=0.25).get_paths(): # 将路径的xy坐标转为map的投影坐标 x, y = path.vertices.T # 添加z=0的维度,转为3D线条 ax.plot3D(x, y, 0, linewidth=0.25, color='black') # 绘制国界线:同样处理路径 for path in map.drawcountries(linewidth=0.35).get_paths(): x, y = path.vertices.T ax.plot3D(x, y, 0, linewidth=0.35, color='gray') plt.show()
补充说明
如果你的matplotlib版本较低(比如3.0之前),原教程代码可能可以正常运行,但新版matplotlib对3D轴的API做了调整,导致旧代码失效。如果长期使用地理绘图,建议迁移到Cartopy,它是Basemap的官方替代库,对新版matplotlib支持更好。
内容的提问来源于stack exchange,提问作者m2h9
相关产品推荐
相关产品推荐

