Python 使用cartopy从netcdf打印数据不是0经度处的打印数据
我正在用网格数据来完成我的旅程,我一直在尝试用cartopy从netcdf文件中绘制一些温度数据。我遵循了一些例子,我不明白为什么我的阴谋在中间有一条白线。(我已经检查了数据,矩阵上都是数字,没有N)Python 使用cartopy从netcdf打印数据不是0经度处的打印数据,python,netcdf,python-xarray,cartopy,Python,Netcdf,Python Xarray,Cartopy,我正在用网格数据来完成我的旅程,我一直在尝试用cartopy从netcdf文件中绘制一些温度数据。我遵循了一些例子,我不明白为什么我的阴谋在中间有一条白线。(我已经检查了数据,矩阵上都是数字,没有N) 问得好!问题在于,对于大多数网格化气候数据,经度坐标看起来像: array([1.25, 3.75, 6.25, ..., 351.25, 353.75, 356.25, 358.75]) 因此,没有明确的经度=0点,这通常会在绘图中显示一条细细的白线。我有时也在发表的论文(甚至《自然》)中看
问得好!问题在于,对于大多数网格化气候数据,经度坐标看起来像:
array([1.25, 3.75, 6.25, ..., 351.25, 353.75, 356.25, 358.75])
因此,没有明确的经度=0
点,这通常会在绘图中显示一条细细的白线。我有时也在发表的论文(甚至《自然》)中看到这个问题
解决这个问题的方法有很多,但最简单的方法是使用cartopy
包,它有一个名为add\u circular\u point
的实用程序,基本上是在经度=0
点的任一侧插入数据。(参考号:)
这种方法唯一的缺点是,当使用xarray
时,这意味着您必须手动提取数据,然后您会丢失元数据,因此我编写了一个函数,在维护元数据的同时保持这种良好的易用性
从cartopy.util导入添加循环协调
将xarray作为xr导入
def xr_添加_循环_点(da):
"""
投入
da:xr.DataArray,带维度(时间、纬度、经度)
"""
#使用“添加循环点”插值输入数据
lon_idx=da.dims.index('lon')
换行数据,换行长度=添加循环点(da.values,coord=da.lon,axis=lon\u idx)
#使用新数据生成输出DataArray,但结构与输入相同
输出数据=xr.DataArray(数据=包裹数据,
coords={'time':da.time,'lat':da.lat,'lon':wrap_lon},
dims=da.dims,
attrs=da.attrs)
返回输出数据
示例
例如,如果我的初始数据数组如下所示:
<xarray.DataArray 'tas' (time: 60, lat: 90, lon: 144)>
[777600 values with dtype=float32]
Coordinates:
* lat (lat) float64 -89.49 -87.98 -85.96 -83.93 ... 85.96 87.98 89.49
* lon (lon) float64 1.25 3.75 6.25 8.75 11.25 ... 351.3 353.8 356.2 358.8
* time (time) object 1901-01-16 12:00:00 ... 1905-12-16 12:00:00
Attributes:
long_name: Near-Surface Air Temperature
units: K
valid_range: [100. 400.]
cell_methods: time: mean
standard_name: air_temperature
original_units: deg_k
original_name: t_ref
cell_measures: area: areacella
associated_files: baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation...
现在,我可以使用我的函数生成一个新的插值数据数组,如下所示:
wrapped_tas = xr_add_cyclic_point(tas)
希望有帮助!!:)
tas.mean(dim='time').plot.contourf()
wrapped_tas = xr_add_cyclic_point(tas)
wrapped_tas
<xarray.DataArray (time: 60, lat: 90, lon: 145)>
array([[[251.19466, 251.19469, 251.19472, ..., 251.19226, 251.19073,
251.19466], ...
[250.39403, 250.39468, 250.39961, ..., 250.39429, 250.39409,
250.39403]]], dtype=float32)
Coordinates:
* time (time) object 1901-01-16 12:00:00 ... 1905-12-16 12:00:00
* lat (lat) float64 -89.49 -87.98 -85.96 -83.93 ... 85.96 87.98 89.49
* lon (lon) float64 1.25 3.75 6.25 8.75 11.25 ... 353.8 356.2 358.8 361.2
Attributes:
long_name: Near-Surface Air Temperature
units: K
valid_range: [100. 400.]
cell_methods: time: mean
standard_name: air_temperature
original_units: deg_k
original_name: t_ref
cell_measures: area: areacella
associated_files: baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation...
wrapped_tas.mean(dim='time').plot.contour()