我正在尝试将一些代码从底图迁移到cartopy,我很困惑,为什么我无法让它工作。但是,我基本上希望在底图提供的类似'nsper'投影上有一个散点图。
原始代码如下所示:
from mpl_toolkits.basemap import Basemap
import numpy as np
from matplotlib import pyplot as plt
lon_0 = -75.0
image_name = 'original.png'
lon_swath1 = np.arange(-65,66,1)
lat_swath1 = np.zeros(np.shape(lon_swath1))
lat_swath2 = np.arange(-40,40,1)
lon_swath2 = -75.0*np.ones(np.shape(lat_swath2))
m = Basemap(projection='nsper',lon_0=lon_0,lat_0=0)
x1,y1 = m(lon_swath1,lat_swath1)
x2,y2 = m(lon_swath2,lat_swath2)
fig = plt.figure(figsize=(10,6.5))
m.drawcoastlines()
m.scatter(x1, y1, s=2.5, marker="o")
m.scatter(x2, y2, s=2.5, marker="x")
fig.savefig('%s' % image_name, format='png')
plt.show()
plt.close(fig)
并生成一个如下所示的数字: original basemap figure.
如果我尝试做我认为相当于纸板的东西,我就不会得到完整的全球,而且无论我怎么努力我都不能
import cartopy.crs as ccrs
import numpy as np
from matplotlib import pyplot as plt
lon_0 = -75.0
image_name = 'test.png'
lon_swath1 = np.arange(-65,66,1)
lat_swath1 = np.zeros(np.shape(lon_swath1))
lat_swath2 = np.arange(-40,40,1)
lon_swath2 = -75.0*np.ones(np.shape(lat_swath2))
fig = plt.figure(figsize=(10,6.5))
ax = plt.axes(projection= ccrs.Geostationary(central_longitude=lon_0))
ax.coastlines()
plt.scatter(lon_swath1, lat_swath1, s=2.5, marker="o", transform=ccrs.Geodetic())
plt.scatter(lon_swath2, lat_swath2, s=2.5, marker="x", transform=ccrs.Geodetic())
fig.savefig('%s' % image_name, format='png')
plt.show()
plt.close(fig)
zoomed in Geostationary equivalent
我想要的是全球范围,但是,如果我尝试用以下方法强制解决问题,我会收到错误。
import cartopy.crs as ccrs
import numpy as np
from matplotlib import pyplot as plt
lon_0 = -75.0
image_name = 'broken.png'
lon_swath1 = np.arange(-65,66,1)
lat_swath1 = np.zeros(np.shape(lon_swath1))
lat_swath2 = np.arange(-40,40,1)
lon_swath2 = -75.0*np.ones(np.shape(lat_swath2))
fig = plt.figure(figsize=(10,6.5))
ax = plt.axes(projection= ccrs.Geostationary(central_longitude=lon_0))
extent = ax.get_extent()
ax.coastlines()
plt.scatter(lon_swath1, lat_swath1, s=2.5, marker="o", transform=ccrs.Geodetic())
plt.scatter(lon_swath2, lat_swath2, s=2.5, marker="x", transform=ccrs.Geodetic())
ax.set_extent(extent,crs=ccrs.Geostationary(central_longitude=lon_0))
fig.savefig('%s' % image_name, format='png')
plt.show()
plt.close(fig)
我得到的错误:
ax.set_extent(extent,crs=ccrs.Geostationary(central_longitude=lon_0))
File "/users/karpowicz/.local/external/anaconda/lib/python2.7/site-packages/cartopy/mpl/geoaxes.py", line 652, in set_extent
ylim=self.projection.y_limits))
ValueError: Failed to determine the required bounds in projection coordinates. Check that the values provided are within the valid range (x_limits=[-5372584.78444, 5372584.78444], y_limits=[-5372584.78444, 5372584.78444]).
如果有人有任何建议或想法我会很感激!
答案 0 :(得分:1)
这里的问题是您的地图在投影中,但您尝试传递的范围不是。我老老实实地忘记了针对此问题的具体修复方法(我之前已经遇到过这个问题),但是这里有一个快捷方式 - 抛出ax.set_extent
并使用它代替:
ax.set_global()
答案 1 :(得分:1)
对我来说这看起来像个错误。 @ ResMar断言投影中的范围不正确。根据{{3}}:
如果没有给出crs,则返回范围'坐标系将 这个轴的CRS。
即使该函数返回的范围超出了错误消息中指定的x和y限制,也可以提供在这些限制范围内但仍然产生错误的范围。
编辑:@ResMar在这种情况下说for(var i = 0, var found = false; i < Mena.index && found == false; i ++)
{
//your stuff...
if(data>0)
{
//your stuff...
found = true; //break
}
}
是正确的方法是正确的