Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用cartopy从netcdf打印数据不是0经度处的打印数据_Python_Netcdf_Python Xarray_Cartopy - Fatal编程技术网

Python 使用cartopy从netcdf打印数据不是0经度处的打印数据

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点,这通常会在绘图中显示一条细细的白线。我有时也在发表的论文(甚至《自然》)中看

我正在用网格数据来完成我的旅程,我一直在尝试用cartopy从netcdf文件中绘制一些温度数据。我遵循了一些例子,我不明白为什么我的阴谋在中间有一条白线。(我已经检查了数据,矩阵上都是数字,没有N)


问得好!问题在于,对于大多数网格化气候数据,经度坐标看起来像:

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()