从 netcdf 的二维数组生成多个地图

Generating multiple maps from 2d array from netcdf

我需要为每年的每个月生成多个温度图,从 2002 年到 2018 年。 我设法为 2002 年的所有数据绘制了一个图(大约 6 个月)。我已将我的 netcdf 文件导入到一个数组中,并将 3d 数组切片为 lat lon lst 的 2d 数组。 我使用 pcolormesh 绘制了一个奇异的 lon, lat, data_2d 图,但无法弄清楚如何定义月份,因此我可以单独绘制它们。 数据在网上不可用,但我正在寻找可以遍历月份并将它们分别绘制到地图上的通用函数或命令。

  import netCDF4 
    import numpy as np                             
    import xarray as xr
    import pandas as pd
    import os
    from netCDF4 import Dataset
    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.axes_grid1 import make_axes_locatable
    import cartopy.crs as ccrs
    import cartopy.feature as cfeature
    print ('All packages imported')
    # make an empty np array
    data_grid = []
    # list of files 
    days = pd.date_range (start='4/7/2002', end='31/7/2002')
    print ('Initiate for loop')

    # for loop iterating through %date range to find path files
    for day in days:
        # defining what paths should look like
            # %i = integer, %02d = integer with two characters, for year month and day
        path = "/data/atsr/MMDB/AQUA_MODIS_L3E/2.00/%i/%02d/%02d/ESACCI-LST-L3C-LST-MODISA-LONDON_0.01deg_1DAILY_DAY-%i%02d%02d000000-fv2.00.nc" % (day.year, day.month, day.day, day.year, day.month, day.day)
        print(path)
        # os fetches contents 
        if os.path.isfile(path):    
            # open file and define lst daily mean
            f = Dataset(path)
            lst = f['lst'][:]
            # populate numpy array, lst slice ignoring first index and accounting for NaN
            data_grid.append(f['lst'][0,:,:].filled(np.nan))
            f.close()
        else: print ("%s not found" % path)

    # stack array into three dimensions (lat, lon, time)
    data_3d = np.dstack(data_grid)  

    # calculate mean of each grid point pixel and ignore NaN values 
        # make it 2d
    data_2d = np.nanmean(data_3d, axis = 2)

# define lat lon from last file 
    f = netCDF4.Dataset ('/data/atsr/MMDB/AQUA_MODIS_L3E/2.00/2018/12/31/ESACCI-LST-L3C-LST-MODISA-LONDON_0.01deg_1DAILY_DAY-20181231000000-fv2.00.nc')
    print (f)

    # define lat and lons including all indicies 
    lat = f['lat'][:]
    lon = f['lon'][:]

    # plot data
    # set up a map and size
    fig = plt.figure(figsize=(12,12))
    ax = fig.add_subplot(projection=ccrs.PlateCarree())
    # define the coordinate system that the grid lons and grid lats are on
    mapped_array = ax.pcolormesh(lon, lat, data_2d)

    # add title 
    plt.title ('Aqua Modis London', fontsize=12) 
    # set axis labels
    plt.xlabel('Latitude', fontsize=10)
    plt.ylabel('Longitude',fontsize=10) 
            
    # add features
    ax.coastlines()
    ax.add_feature(cfeature.BORDERS, edgecolor='black')
    # add colorbar
    divider = make_axes_locatable(ax)
    ax_cb = divider.new_horizontal(size="5%", pad=0.1, axes_class=plt.Axes)
    fig.add_axes(ax_cb)
    plt.colorbar(mapped_array, cax=ax_cb)

    #add lat lon grids and ticks
    gl = ax.gridlines(draw_labels=True, alpha=0.1)
    gl.top_labels = False
    gl.right_labels = False    
    # show and save   
    plt.show() 
    plt.close()

我建议使用 xarray 包将所有数据收集到一个数组中。先把所有的netCDF放在同一个目录下,然后合并:

import xarray as xr
f = xr.open_mfdataset('/data/atsr/MMDB/AQUA_MODIS_L3E/2.00/ESACCI-LST-L3C-LST-MODISA-LONDON_0.01deg_1DAILY_DAY*.nc')

从那里看起来你想要月平均值:

f_monthly = f.resample(time = 'MS', skipna = True).mean()

然后遍历每个 months/years 和绘图就非常简单了。

f_monthly.sel(time = '2018-12').plot()