这个问题是关于绘制一些我拥有的使用 Lambert Conformal (LCC) CRS 的数据。虽然这些问题特别涉及在多个投影中绘制 LCC 数据,但它也适用于一般的 cartopy 使用,因为我想更好地理解使用 cartopy 绘制的逻辑/过程。
下面是我正在尝试做的一些代码示例。第一个示例只是简单地绘制一些 LCC 数据。我使用的数据可在此处的链接中找到。
import cartopy.crs as ccrs
import cartopy.feature as cf
import matplotlib.pyplot as plt
import numpy as np
proj = ccrs.LambertConformal(central_latitude = 25,
central_longitude = 265,
standard_parallels = (25, 25))
# Data and coordinates (from download link above)
with np.load('nam_218_20120414_1200_006.npz') as nam:
dat = nam['dpc']
lat = nam['lat']
lon = nam['lon']
ax = plt.axes(projection = proj)
ax.pcolormesh(lon, lat, dat, transform = ccrs.PlateCarree())
ax.add_feature(cf.NaturalEarthFeature(
category='cultural',
name='admin_1_states_provinces_lines',
scale='50m',
facecolor='none'))
ax.coastlines('50m')
ax.add_feature(cf.BORDERS)
plt.show()
产生的情节可以在这里看到:
LCC 地图上的美国露点
使用 cartopy 时我的第一个困惑是为什么我在绘图时总是必须转换为PlateCarree
?我最初的想法是调用的transform
关键字pcolormesh
需要 LCC 投影信息而不是PlateCarree
.
接下来,如果我想在另一个投影(例如正交投影)中绘制我的 LCC 数据,我会像下面那样做吗?
# First, transform from LCC to Orthographic
transform = proj.transform_points(ccrs.Orthographic(265,25), lon, lat)
x = transform[..., 0]
y = transform[..., 1]
ax = plt.axes(projection = ccrs.Orthographic(265,25))
ax.pcolormesh(x, y, dat, transform = ccrs.PlateCarree())
ax.add_feature(cf.NaturalEarthFeature(
category='cultural',
name='admin_1_states_provinces_lines',
scale='50m',
facecolor='none'))
ax.coastlines('50m')
ax.add_feature(cf.BORDERS)
ax.set_global()
产生的情节可以在这里看到:
正交地图上的美国露点
我认为正交地图看起来是正确的,但我想确保我正确理解了用 cartopy 重新投影的过程。
总之,我想知道以下几点:
- 绘图时总是必须这样做
transform
吗?PlateCarree
为什么或者为什么不? - 重新投影是否只需要调用该
transform_points
方法或是否涉及其他步骤?
更新 1
根据@swatchai的回答,我的问题 2 的答案似乎transform_points
不是必需的。transform
可以在许多 matplotlib 绘图方法中简单地使用关键字参数。这是我最初的想法。但是,跳过transform_points
对我没有用。请参见下面的示例:
ax = plt.axes(projection = ccrs.Orthographic(265,25))
ax.pcolormesh(lon, lat, dat, transform = proj)
ax.add_feature(cf.NaturalEarthFeature(
category='cultural',
name='admin_1_states_provinces_lines',
scale='50m',
facecolor='none'))
ax.coastlines('50m')
ax.add_feature(cf.BORDERS)
ax.set_global()
这产生了这个情节:
没有 transform_points 步骤的正交图
问题似乎是纬度和经度输入没有转换为网格坐标,因此它们仅被绘制在图的极小区域中。因此,为了扩展问题 2,如果您应该跳过transform_points
,根据我上面的示例,cartopy 的绘图方法是否存在错误?还是我还缺少一步?