根据绘图的投影调整 cartopy 中的坐标
Adapting coordinates in cartopy depending on the projection of a plot
在下面的示例中,如果我使用 ccrs.Mercator()
投影而不是 ccrs.PlateCarree()
,我就失去了我的观点(即,我不理解坐标的变化):
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
mypt = (6, 56)
ax0 = plt.subplot(221, projection=ccrs.PlateCarree()) # OK
ax1 = plt.subplot(222, projection=ccrs.Mercator()) # NOT OK
ax2 = plt.subplot(224, projection=ccrs.Mercator()) # NOT OK
def plotpt(ax, extent=(-15,15,46,62)):
ax.plot(mypt[0], mypt[1], 'r*', ms=20)
ax.set_extent(extent)
ax.coastlines(resolution='50m')
ax.gridlines(draw_labels=True)
plotpt(ax0)
plotpt(ax1)
plotpt(ax2, extent=(-89,89,-89,89))
plt.show()
看起来我的点坐标从 (6,56) 到 (0,0)
我错过了什么?
为什么 ccrs.PlateCarree()
的行为正确,而 ccrs.Mercator()
的行为不正确?我应该在某处添加任何转换吗?
[编辑解决方案]
我最初的困惑来自于 projection
适用于情节,而 transform
适用于数据,这意味着当它们不共享同一个系统时它们应该设置不同 - 我的首先尝试使用 transform
,其中错误如下面的 ax1
,ax1bis
是解决方案。
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
mypt = (6, 56)
ax0 = plt.subplot(221, projection=ccrs.PlateCarree())
ax1 = plt.subplot(222, projection=ccrs.Mercator())
ax1bis = plt.subplot(223, projection=ccrs.Mercator())
ax2 = plt.subplot(224, projection=ccrs.Mercator())
def plotpt(ax, extent=(-15,15,46,62), **kwargs):
ax.plot(mypt[0], mypt[1], 'r*', ms=20, **kwargs)
ax.set_extent(extent)
ax.coastlines(resolution='50m')
ax.gridlines(draw_labels=True)
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
plotpt(ax0) # correct because projection and data share the same system
plotpt(ax1, transform=ccrs.Mercator()) # WRONG
plotpt(ax1bis, transform=ccrs.PlateCarree()) # Correct, projection and transform are different!
plotpt(ax2, extent=(-89,89,-89,89), transform=ccrs.Mercator()) # WRONG
plt.show()
是的,您应该将 transform
关键字添加到 plot
调用中。您还应该指定要设置范围的坐标系:
def plotpt(ax, extent=(-15,15,46,62)):
ax.plot(mypt[0], mypt[1], 'r*', ms=20, transform=ccrs.PlateCarree())
ax.set_extent(extent, crs=ccrs.PlateCarree())
ax.coastlines(resolution='50m')
ax.gridlines(draw_labels=True)
cartopy 文档 http://scitools.org.uk/cartopy/docs/latest/tutorials/understanding_transform.html 现在提供了关于变换和投影的基本指南。为避免意外,您应该始终在地图上绘制数据时指定转换。
在下面的示例中,如果我使用 ccrs.Mercator()
投影而不是 ccrs.PlateCarree()
,我就失去了我的观点(即,我不理解坐标的变化):
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
mypt = (6, 56)
ax0 = plt.subplot(221, projection=ccrs.PlateCarree()) # OK
ax1 = plt.subplot(222, projection=ccrs.Mercator()) # NOT OK
ax2 = plt.subplot(224, projection=ccrs.Mercator()) # NOT OK
def plotpt(ax, extent=(-15,15,46,62)):
ax.plot(mypt[0], mypt[1], 'r*', ms=20)
ax.set_extent(extent)
ax.coastlines(resolution='50m')
ax.gridlines(draw_labels=True)
plotpt(ax0)
plotpt(ax1)
plotpt(ax2, extent=(-89,89,-89,89))
plt.show()
看起来我的点坐标从 (6,56) 到 (0,0)
我错过了什么?
为什么 ccrs.PlateCarree()
的行为正确,而 ccrs.Mercator()
的行为不正确?我应该在某处添加任何转换吗?
[编辑解决方案]
我最初的困惑来自于 projection
适用于情节,而 transform
适用于数据,这意味着当它们不共享同一个系统时它们应该设置不同 - 我的首先尝试使用 transform
,其中错误如下面的 ax1
,ax1bis
是解决方案。
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
mypt = (6, 56)
ax0 = plt.subplot(221, projection=ccrs.PlateCarree())
ax1 = plt.subplot(222, projection=ccrs.Mercator())
ax1bis = plt.subplot(223, projection=ccrs.Mercator())
ax2 = plt.subplot(224, projection=ccrs.Mercator())
def plotpt(ax, extent=(-15,15,46,62), **kwargs):
ax.plot(mypt[0], mypt[1], 'r*', ms=20, **kwargs)
ax.set_extent(extent)
ax.coastlines(resolution='50m')
ax.gridlines(draw_labels=True)
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
plotpt(ax0) # correct because projection and data share the same system
plotpt(ax1, transform=ccrs.Mercator()) # WRONG
plotpt(ax1bis, transform=ccrs.PlateCarree()) # Correct, projection and transform are different!
plotpt(ax2, extent=(-89,89,-89,89), transform=ccrs.Mercator()) # WRONG
plt.show()
是的,您应该将 transform
关键字添加到 plot
调用中。您还应该指定要设置范围的坐标系:
def plotpt(ax, extent=(-15,15,46,62)):
ax.plot(mypt[0], mypt[1], 'r*', ms=20, transform=ccrs.PlateCarree())
ax.set_extent(extent, crs=ccrs.PlateCarree())
ax.coastlines(resolution='50m')
ax.gridlines(draw_labels=True)
cartopy 文档 http://scitools.org.uk/cartopy/docs/latest/tutorials/understanding_transform.html 现在提供了关于变换和投影的基本指南。为避免意外,您应该始终在地图上绘制数据时指定转换。