如何从 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()
转换取决于轴的 xlim
和 ylim
,因此首先设置使用 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)
我有一个带有一些点的 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()
转换取决于轴的 xlim
和 ylim
,因此首先设置使用 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)