我想绘制一个覆盖正投影上所有球体的网格。
问题是投影之外的单元格没有正确绘制。 drawgreatcircles
指向here时发生了这种情况。
我也尝试使用here描述的多边形,但同样的问题。
最后,我根据Wikipedia对自定义检查进行了编码。这个想法是针对每个细分的每个点,我们检查cos c
(参见维基百科),如果余弦为负,则不要绘制它。
我的问题是:我们可以使用底图自己的函数进行这种检查吗? 这种策略不适用于其他预测。
另外,为什么这种检查不包含在Basemap中?
答案 0 :(得分:3)
感谢您的示例,我获取了数据并使用cartopy绘制了它。创建图表需要进行以下更改:
import cartopy.crs as ccrs
ax =plt.axes(projection=ccrs.Orthographic())
plt.pcolormesh(lons, lats,val, edgecolors='k',
linewidths=1, transform=ccrs.PlateCarree())
ax.coastlines()
ax.gridlines()
plt.show()
这是使用pcolormesh所以非常快(虽然你的例子在我的机器上起初并不慢)。
答案 1 :(得分:1)
这是使用pcolor的解决方案:
import pylab as plt
from mpl_toolkits.basemap import Basemap
import numpy as np
nb_lat2 = 20
nb_lat = 2*nb_lat2
nb_lon = 3*(2*(nb_lat+1) - 1)
lats = np.zeros((2*nb_lat, nb_lon))
lons = np.zeros((2*nb_lat, nb_lon))
val = np.zeros((2*nb_lat, nb_lon))
dlat = 90./nb_lat2
for i in range(nb_lat):
nb_lon = 2*(i+1)-1
if ((i+1) > nb_lat2):
nb_lon = 2*(nb_lat - i)-1
dlon = 120./nb_lon
lats[2*i][:] = 90 - i*dlat
lats[2*i+1][:] = 90 - (i+1)*dlat
for j in range(nb_lon):
lons[2*i][j] = j*dlon
lons[2*i+1][j] = j*dlon
for k in range(1,3):
lons[2*i][j + k*nb_lon] = j*dlon + 120.*k
lons[2*i+1][j + k*nb_lon] = j*dlon + 120.*k
lons[2*i][3*nb_lon:] = nb_lon*dlon + 240.
lons[2*i+1][3*nb_lon:] = nb_lon*dlon + 240.
lons = lons - 180
val = lats + lons
# Crash
##m = Basemap(projection='robin',lon_0=0,resolution=None)
#m = Basemap(projection='mill',lon_0=0)
m = Basemap(projection='ortho', lat_0=0,lon_0=0)
x, y = m(lons, lats)
m.pcolor(x,y,val, edgecolors='k', linewidths=1)
m.drawcoastlines()
m.drawparallels(np.arange(-90.,91.,30.))
m.drawmeridians(np.arange(-180.,181.,60.))
plt.show()
这正是我想要的:绘制矩形并用一种颜色填充它们。 但它很慢(太慢)。很多单元格未被使用:在latidude行的末尾,我们将未使用单元格的宽度设置为0.
另一个问题是一些预测崩溃(例如Robin)。