Построение netCDF с xarray, данные не отображаются, но легенда - PullRequest
1 голос
/ 09 октября 2019

Я пытаюсь использовать простую функцию .plot () из xarray для файла netCDF из группы анализа состава атмосферы .

Скажем, я хочу построить график концентрации PM2.5из Северной Америки в 2000 году доступно здесь .

Когда я пытаюсь построить набор данных, я получаю пустую фигуру, даже если данные существуют, как показано на панели легенды.

import xarray as xr
import netCDF4 as nc
import matplotlib.pyplot as plt

path_to_nc="my/path/file.nc"

ds=xr.open_dataset(path_to_nc)
print(ds)
>>>

<xarray.Dataset>
Dimensions:  (LAT: 4550, LON: 9300)
Coordinates:
  * LON      (LON) float64 -138.0 -138.0 -138.0 -138.0 ... -45.03 -45.01 -45.01
  * LAT      (LAT) float64 68.0 67.99 67.97 67.96 ... 22.53 22.52 22.51 22.5
Data variables:
    PM25     (LAT, LON) float32 ...

Файл имеет значения (не только nan).

# Range of values:
ds=ds['PM25']
print(ds)
>>>

<xarray.DataArray 'PM25' (LAT: 4550, LON: 9300)>
array([[1.6, 1.6, 1.6, ..., 1.2, 1.2, 1.2],
       [1.6, 1.6, 1.6, ..., 1.2, 1.2, 1.2],
       [1.6, 1.6, 1.6, ..., 1.2, 1.2, 1.2],
       ...,
       [nan, nan, nan, ..., nan, nan, nan],
       [nan, nan, nan, ..., nan, nan, nan],
       [nan, nan, nan, ..., nan, nan, nan]], dtype=float32)
Coordinates:
  * LON      (LON) float64 -138.0 -138.0 -138.0 -138.0 ... -45.03 -45.01 -45.01
  * LAT      (LAT) float64 68.0 67.99 67.97 67.96 ... 22.53 22.52 22.51 22.5
Attributes:
    standard_name:  PM25
    units:          ug/m3

Но если я попытаюсь построить значения, я получу пустой топор.

ds.plot()

Выход

1 Ответ

1 голос
/ 10 октября 2019

Проблема в том, что вы пытаетесь построить слишком много данных вместе. Если вы просто выберете подмножество из них, оно будет работать:

#select data
dssel=ds.where((-125 < ds.LON) & (ds.LON < -115)
         & (49 < ds.LAT) & (ds.LAT < 55), drop=True)
#plot PM2.5
plt.figure()
dssel.PM25.plot()

Вот результат: enter image description here

Интересно, что если вы наносите данные непосредственно с помощью matplotlib, то этонамного быстрее, и я могу построить весь набор данных (на моем 4-летнем и не очень быстром ноутбуке это занимает около 20 секунд). В этом случае я использовал библиотеку netCDF4 для загрузки набора данных PM2.5.

from netCDF4 import Dataset
nc_fid = Dataset(fpath, 'r')

lats = nc_fid.variables['LAT'][:]  # extract/copy the data
lons = nc_fid.variables['LON'][:]
PM25 = nc_fid.variables['PM25'][:]

fig, axs = plt.subplots(figsize=(15, 10), nrows=2,ncols=1,gridspec_kw={'height_ratios': [20,1.5]},constrained_layout=True)
pcm=axs[0].pcolormesh(lons,lats,PM25,cmap='viridis')
cbar=fig.colorbar(pcm,cax=axs[1], extend='both', orientation='horizontal')
cbar.set_label('PM 2.5 [$\mu$g m$^{-3}]$')

enter image description here

...