如何从 cartopy 转置到轴坐标

How to transpose from cartopy to axes coords

我有一个带有一些点的 cartopy GeoAxesSubplot,可能还有线或多边形。投影可以是 cartopy 支持的任何投影,包括正交投影。

我可以使用不同的变换进行绘图,正如所解释的 here:

from matplotlib import pyplot as plt
import cartopy.crs as ccrs

# Projection could be any, e.g. globe or Arctic Stereopolar...
ax = plt.axes(projection=ccrs.Mollweide())
ax.coastlines()

# Plot using the coordinate system of the Axes
a = ax.plot(0.45, 0.5, transform=ax.transAxes, marker='o', ms=10)

# Plot using the projected coordinates using cartopy.crs
b = ax.plot(0, 0, transform=ccrs.PlateCarree() , marker='o', ms=10)

我想转换地理坐标以获得轴上对象的笛卡尔坐标(例如子图)。即图中坐标轴[0,1]范围内的坐标,左下角为(0,0),右上角为(1,1)

在上述情况下,b 应转换为 (0.5, 0, 5),因为它位于地图的中心。

可以使用 transform_points, however, I have not been able to transpose to axes-coords 来完成类似的事情。

matplotlib 和 cartopy 中定义了许多参数来控制对象在地图上的位置(范围、投影、中心子午线、视图高程等)。因此,引入另一个库可能很尴尬。


给出的答案,例如 解释了如何实现反向,但是,该示例没有给出如何生成轴坐标的正确答案。

请记住,“地理坐标”的定义并不明确,因为您混合了两个投影(Mollweide 和 PlateCarree),两者 都使用“地理坐标”。还要小心使用精确的中心,因为即使您使用不正确的坐标,它也可能会意外地看起来正确。

因此您可能首先需要将您的数据转换为地图的投影(projection)。

除此之外,您 link 的 Matplotlib 转换教程提供了进行转换所需的所有信息。

设置输入:

from matplotlib import pyplot as plt
import cartopy.crs as ccrs

# sample point coordinates in Plate-Carree
x_pc = -110.0 # longitude
y_pc = 45.0 # latitude

map_proj = ccrs.Mollweide()
data_proj = ccrs.PlateCarree()

转换取决于轴的 xlimylim,因此首先设置使用 ax.set_global() 很重要。这给出了从投影到显示坐标(以及后续轴坐标)的正确映射。

fig, ax = plt.subplots(subplot_kw=dict(projection=map_proj), facecolor='w')
ax.set_global()
ax.coastlines()

b = ax.plot(x_pc, y_pc, 'go', transform=data_proj, ms=5)

# convert to map-coordinates (Mollweide)
x_mollw, y_mollw = ax.projection.transform_point(x_pc, y_pc, data_proj)

# convert to display coordinates
x_disp, y_disp = ax.transData.transform((x_mollw, y_mollw))

# convert to axes coordinates
x_axes, y_axes = ax.transAxes.inverted().transform((x_disp, y_disp))

# plot same point but using axes coordinates
ax.plot(x_axes, y_axes, 'ro', transform=ax.transAxes, ms=10, mfc='none', mew=2)