Matplotlib 从基本地图近边透视(nsper)投影迁移到使用cartopy地球静止投影

Matplotlib 从基本地图近边透视(nsper)投影迁移到使用cartopy地球静止投影,matplotlib,matplotlib-basemap,cartopy,Matplotlib,Matplotlib Basemap,Cartopy,我正在尝试将一些代码从basemap迁移到cartopy,我很困惑为什么我不能让它工作。然而,我基本上希望在basemap提供的类似“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.a

我正在尝试将一些代码从basemap迁移到cartopy,我很困惑为什么我不能让它工作。然而,我基本上希望在basemap提供的类似“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)
并生成一个如下所示的图形:

如果我试着做我认为在cartopy中是等效的事情,我就不能得到完整的地球仪,无论我多么努力,我也做不到

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)

我想要的是一个完整的全局范围,但是,如果我试图用以下内容强制解决问题,我会得到一个错误

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]).

如果有人有任何建议或想法,我将不胜感激

这里的问题是,您的地图处于投影中,但您试图通过的范围不是投影。老实说,我已经忘记了具体的修复方法是什么(我以前遇到过很多次),但这里有一个快捷方式,可以扔掉
ax。设置\u区段
,改用它:

ax.set_global()

对我来说这看起来像个虫子@ResMar关于区段不在投影中的断言是不正确的。根据:

如果未给出crs,则返回的区段坐标系将为 该轴的CRS

即使该函数返回的扩展数据块超出了错误消息中指定的x和y限制,也可以提供在这些限制内但仍会产生错误的扩展数据块


编辑:@ResMar正确地说,
ax.set_global()
在这种情况下是正确的方法

此功能的API对我来说并不明显,文档也没有多大帮助。但我看到你在大都会办公室工作,所以我觉得你比我更清楚。