在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
相关产品推荐
相关产品推荐

