python - 使用 xarray 绘制 netCDF,数据未显示,但图例是

标签 python matplotlib python-xarray netcdf4

我正在尝试在 atmospheric composition analysis group 的 netCDF 文件上使用 xarray 中的简单 .plot() 函数。 .

假设我想绘制 2000 年北美的 PM2.5 浓度,可用 here .

当我尝试绘制数据集时,即使数据存在(如图例栏所示),我也会得到一个空图。

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

Output

最佳答案

问题是您试图将太多数据绘制在一起。如果您只选择其中的一个子集,它就可以工作:

#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

关于python - 使用 xarray 绘制 netCDF,数据未显示,但图例是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58309929/

相关文章:

python - 如何限制到套接字的连接数并在客户端触发超时(Python)

python - string.format,不同长度打破表

python - 在新的命令窗口中运行python : windows : Subporcess open a . bat文件并运行

javascript - 将 window.location 传递给 Flask url_for

python - 堆积条形图 - 从非数值项开始

python - 在MatplotlibWidget pyqt5中使用FigureCanvasQTAgg时出错

python - 如何使用 xESMF 将高分辨率 GRIB 网格重新采样为较粗的分辨率?

python - 提取 xarray 中的坐标值

字典中的 Matplotlib 散点图标记类型

python - cartopy:导入cartopy.crs错误