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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:10:59