无法使用“ ax.add_collection3d(map.drawcoastlines())”将“ map.drawcoastline”添加到3d图形

Kus*_*dya 6 visualization data-visualization matplotlib matplotlib-basemap

所以我想用绘制3d地图matplotlib basemap。但是会弹出错误消息。

import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
from mpl_toolkits.basemap import Basemap 
from matplotlib.collections import PolyCollection 
import numpy as np
map = Basemap(llcrnrlon=-20,llcrnrlat=0,urcrnrlon=15,urcrnrlat=50,)
fig = plt.figure() 

ax = Axes3D(fig)
#ax.set_axis_off() 
ax.azim = 270 
ax.dist = 7
polys = [] 
for polygon in map.landpolygons: 
    polys.append(polygon.get_coords())


lc=PolyCollection(polys,edgecolor='black',facecolor='#DDDDDD',closed=False)
ax.add_collection3d(lc) 
ax.add_collection3d(map.drawcoastlines(linewidth=0.25)) 
ax.add_collection3d(map.drawcountries(linewidth=0.35))
lons = np.array([-13.7, -10.8, -13.2, -96.8, -7.99, 7.5, -17.3, -3.7]) 
lats = np.array([9.6, 6.3, 8.5, 32.7, 12.5, 8.9, 14.7, 40.39]) 
cases = np.array([1971, 7069, 6073, 4, 6, 20, 1, 1]) 
deaths = np.array([1192, 2964, 1250, 1, 5, 8, 0, 0]) 
places = np.array(['Guinea', 'Liberia', 'Sierra Leone','United States','Mali','Nigeria', 'Senegal', 'Spain'])
x, y = map(lons, lats)
ax.bar3d(x, y, np.zeros(len(x)), 2, 2, deaths, color= 'r', alpha=0.8)
plt.show()
Run Code Online (Sandbox Code Playgroud)

我在第21行的错误消息中 ax.add_collection3d(map.drawcoastlines(linewidth=0.25))说:

'It is not currently possible to manually set the aspect '
NotImplementedError: It is not currently possible to manually set the aspect on 3D axes'
Run Code Online (Sandbox Code Playgroud)

NaO*_*aOH 3

我发现这个问题是因为我有确切的问题。

后来我偶然发现了一些文档,揭示了解决方法 - 如果未实现方面的设置,那么我们就不要通过将 fix_aspect 设置为 false 来设置它:

map = Basemap(fix_aspect=False)

编辑

我想我应该在之前的答案中添加一些内容,以便更容易理解要做什么。

NotImplementedError是 matplotlib 团队有意添加的内容,如此处所示。该错误说明我们正在尝试修复绘图的纵横比,但这并未在 3d 绘图中实现。

使用默认mpl_toolkits.basemap()设置的 3d 绘图会出现此错误。fix_aspect=True

因此,要去掉NotImplementedError,可以考虑fix_aspect=False在调用时添加mpl_toolkits.basemap()。例如:

map = Basemap(llcrnrlon=-20,llcrnrlat=0,urcrnrlon=15,urcrnrlat=50,fix_aspect=False)