xarray.DataArray.roll方法创建不需要的工件

时间:2017-11-17 00:37:33

标签: python-xarray cartopy

最近我一直在使用xarray加载一堆NetCDF文件并使用cartopy绘制它们。

今天我发现了一件有趣的事情。对于我感兴趣的领域,我需要选择从20W到40E的经度。按照设计,我无法在NCL或其他特定工具箱中使用一种方法KEdiff_mean.sel(lat=slice(-50, -10),lon=slice(-20,40))进行地理空间数据,因为lon从0开始到0-360。如果我调用isel(lon=slice(-200,400)而不是(我在3600 * 1800全局网格上工作),它将返回一个空数据数组,然后我找到了这个很棒的DataArray.roll方法。

通过沿着lon维度滚动DataArray,然后我可以选择我想要的经度,越过0度线 KEdiff_mean.roll(lon=1800).isel(lon=slice(1600,2200)).sel(lat=slice(-50, -10))

有趣的是,当我使用DataArray.plot绘制它时,我在没有值的区域上得到了这个奇怪的水平条纹。无论是滚动方法都没有像我预期的那样工作,或者我错过了什么,但除了条纹之外,情节看起来是正确的。有人可以点灯吗?处理此循环经度选择的推荐方法是什么?也许默认情况下首先将经度坐标从0-360替换为-180到180?谢谢!

这是正确的情节:我全局绘制然后设置绘图的范围 Correct plot

调用roll时: Roll before selection

1 个答案:

答案 0 :(得分:0)

不能说我知道陆地上的条纹是怎么回事,但是一个黑客通过使用xr.where来使用原始数据中的掩码,例如我使用的波形数据

hs = xr.open_dataarray('hs') # 2D file
mask = hs.where(hs > 0) # Keep points with data > 0, set others to NaN
new_var = new_var.where(mask > 0) # new_var should be 2D

另一个黑客(我知道我没有回答你的问题)是绘制数据并在陆地上添加一个功能

import cartopy.feature as cfeature
# ...
ax.add_feature(cfeature.LAND, facecolor='white')