Выбор данных с нулевым меридианом - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь сделать простой выбор данных о погоде (NCEP Reanalysis 2) в диапазоне долгот 80W-30E, чтобы получить Atlanti c Ocean. Я нашел это сообщение о той же проблеме. Однако решение, данное в этом посте, у меня не сработало.

Вот моя цифра с пустой строкой в ​​меридиане 0: Figure with blank line

А вот и мой рисунок с использованием решения, приведенного в этом сообщении 1 : Figure with wrong data display

Ниже приведен код:

arq = xr.open_dataset( 'mslp.2014.nc' )
mslpAtl = arq.mslp.roll( lon=32, roll_coords=True ).sel( lat=slice(0,-70), lon=slice(280,30) )

new_lon = mslpAtl.lon.values
new_lon[1:] += np.cumsum( np.diff( mslpAtl.lon ) < -180 ) * 360

mslpAtl.assign_coords( lon=new_lon )

ax = plt.axes( projection=ccrs.PlateCarree() )
mslpAtl.isel( time=0 ).plot.contourf( ax=ax, transform=ccrs.PlateCarree() )
ax.coastlines()
ax.set_xlim( -80, 30 )
ax.set_ylim( -70, 0 )
plt.savefig('teste1.png')
plt.show()

Ниже результаты несколько команд печати, просто для сравнения с сообщением 1 :

print( mslpAtl.lon )

результаты координат долготы после применения roll

<xarray.DataArray 'lon' (lon: 45)>
array([280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5, 300. , 302.5,
       305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5, 325. , 327.5,
       330. , 332.5, 335. , 337.5, 340. , 342.5, 345. , 347.5, 350. , 352.5,
       355. , 357.5,   0. ,   2.5,   5. ,   7.5,  10. ,  12.5,  15. ,  17.5,
        20. ,  22.5,  25. ,  27.5,  30. ], dtype=float32)
Coordinates:
  * lon      (lon) float32 280.0 282.5 285.0 287.5 290.0 ... 22.5 25.0 27.5 30.0
Attributes:
    units:               degrees_east
    long_name:           Longitude
    actual_range:        [  0.  357.5]
    standard_name:       longitude
    axis:                X
    coordinate_defines:  point

Затем команда

print( np.diff( mslpAtl.lon ) < -180 )

определяет большое расстояние между точками данных

[False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False  True False False False False
 False False False False False False False False]

И команда

print( np.cumsum( np.diff( mslpAtl.lon ) < -180 ) )

дает

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
 1 1 1 1 1 1 1]

и, наконец, команду

print( new_lon )

дает измененные координаты долготы, присвоенные данным.

[280.  282.5 285.  287.5 290.  292.5 295.  297.5 300.  302.5 305.  307.5
 310.  312.5 315.  317.5 320.  322.5 325.  327.5 330.  332.5 335.  337.5
 340.  342.5 345.  347.5 350.  352.5 355.  357.5 360.  362.5 365.  367.5
 370.  372.5 375.  377.5 380.  382.5 385.  387.5 390. ]

Что было бы неправильным в приведенном выше коде? Спасибо!

...