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

在Matplotlib 3D绘图中添加Basemap时遇到轴重置ValueError错误的求助

在Matplotlib 3D绘图中添加Basemap时遇到轴重置ValueError错误的求助

我最近在尝试运行一段结合Matplotlib 3D和Basemap的代码时,刚执行第一个片段就卡壳了,碰到了一个轴重置的ValueError,折腾了好一阵没找到解决办法,想问问大家有没有思路。

先给大家看看我的代码:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.basemap import Basemap

map = Basemap()

fig = plt.figure()
ax = Axes3D(fig)

'''
ax.azim = 270
ax.elev = 90
ax.dist = 5
'''

ax.add_collection3d(map.drawcoastlines(linewidth=0.25))
ax.add_collection3d(map.drawcountries(linewidth=0.35))

plt.show()

运行后直接抛出了这个错误:

Traceback (most recent call last):
  File ".../main.py", line 16, in <module>
    ax.add_collection3d(map.drawcoastlines(linewidth=0.25))
  File ".../venv/lib/python3.12/site-packages/mpl_toolkits/mplot3d/axes3d.py", line 2314, in add_collection3d
    collection = super().add_collection(col)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".../venv/lib/python3.12/site-packages/matplotlib/axes/_base.py", line 2260, in add_collection
    self._set_artist_props(collection)
  File ".../venv/lib/python3.12/site-packages/matplotlib/axes/_base.py", line 1177, in _set_artist_props
    a.axes = self
    ^^^^^^
  File ".../venv/lib/python3.12/site-packages/matplotlib/artist.py", line 302, in axes
    raise ValueError("Can not reset the axes.  You are probably "
ValueError: Can not reset the axes.  You are probably trying to re-use an artist in more than one Axes which is not supported

Process finished with exit code 1

我最终的目标是做出类似3D体积图叠加世界地图的效果,现在连第一步的基础地图都没法在3D轴上显示,实在头疼。有没有过来人能指点一下?


解决方案(整理自社区思路)

这个错误的核心原因是:你创建的Basemap默认绑定了Matplotlib自动生成的默认2D Axes,而之后你手动创建的3D Axes是另一个独立的轴对象,当你把Basemap绘制的海岸线/国家边界集合添加到3D轴时,这些绘图元素已经属于那个默认的2D轴了,Matplotlib不允许同一个绘图元素被重复绑定到多个轴上,所以就抛出了这个错误。

只需要调整代码顺序,并且在创建Basemap时明确指定使用我们自己创建的3D Axes即可,修改后的代码如下:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.basemap import Basemap

# 先创建figure和3D轴对象
fig = plt.figure()
ax = Axes3D(fig)

# 创建Basemap时通过ax参数指定使用这个3D轴
map = Basemap(ax=ax)

# 可以开启视角设置调整显示效果
ax.azim = 270
ax.elev = 90
ax.dist = 5

# 现在添加集合就不会有轴冲突的问题了
ax.add_collection3d(map.drawcoastlines(linewidth=0.25))
ax.add_collection3d(map.drawcountries(linewidth=0.35))

plt.show()

这样修改后,Basemap会直接把所有绘图元素关联到你创建的3D轴上,后续再添加其他3D可视化元素(比如你的体积图)也都可以在同一个轴上完成,就能实现你想要的叠加效果了。

备注:内容来源于stack exchange,提问作者ahul-fell-awen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:38:09