def draw_precipitation_nws(ax, prep, map_extent=(73, 136, 17, 54), gridlines=True): """ Draw NWS-style precipitation map. http://jjhelmus.github.io/blog/2013/09/17/plotting-nsw-precipitation-data/ :param ax: `matplotlib.axes.Axes`, the `Axes` instance used for plotting. :param prep: precipitation, dictionary: {'lon': 1D array, 'lat': 1D array, 'data': 2D array} :param map_extent: (lonmin, lonmax, latmin, latmax), longitude and latitude range. :param gridlines: bool, draw grid lines or not. :return: plots dictionary. :Example: >>> plt.ioff() >>> fig = plt.figure(figsize=(8.6, 6.2)) >>> fig.clf() >>> ax = plt.axes((0.1, 0.08, 0.85, 0.92), projection=ccrs.PlateCarree()) >>> prep = {'lon': lon, 'lat': lat, 'data': rain} >>> plots = draw_precipitation_nws(ax, prep, map_extent=[73, 136, 17, 54]) >>> ax.set_title('24h Accumulated Precipitation', fontsize=18, loc='left') >>> cax = fig.add_axes([0.16, 0.08, 0.7, 0.03]) >>> cb = plt.colorbar(plots['prep'], cax=cax, orientation='horizontal', >>> ticks=plots['prep'].norm.boundaries) >>> cb.set_label('Precipitation (mm)', fontsize=10) >>> cb.ax.tick_params(labelsize=10) >>> plt.savefig('D:/plot.png') """ # set data projection datacrs = ccrs.PlateCarree() # plot map background ax.set_extent(map_extent, crs=datacrs) add_china_map_2cartopy(ax, name='province', edgecolor='k', lw=1) add_china_map_2cartopy(ax, name='river', edgecolor='blue', lw=1) # plots container plots = {} # draw precipitation map x, y = np.meshgrid(prep['lon'], prep['lat']) cmap, norm = cm_precipitation_nws() plots['prep'] = ax.pcolormesh(x, y, np.squeeze(prep['data']), norm=norm, cmap=cmap, transform=datacrs) # add grid lines if gridlines: add_gridlines(ax) # return return plots
def draw_qpf_nmc(ax, prep, stations=None, map_extent=(107., 123, 28, 43.)): """ Draw filled-contour QPF. :param ax: ax: `matplotlib.axes.Axes`, the `Axes` instance. :param prep: precipitation, dictionary: necessary, {'lon': 1D array, 'lat': 1D array, 'data': 2D array} optional, {'clevs': 1D array} :param stations: station locations, dictionary: necessary, {'lon': 1D array, 'lat': 1D array} :param map_extent: [lonmin, lonmax, latmin, latmax], longitude and latitude range. :return: plots dictionary. """ # set data projection datacrs = ccrs.PlateCarree() # plot map background ax.set_extent(map_extent, crs=datacrs) add_china_map_2cartopy(ax, name='province', edgecolor='k', lw=1) add_china_map_2cartopy(ax, name='river', edgecolor='blue', lw=1) # plots container plots = {} # draw precipitation map x, y = np.meshgrid(prep['lon'], prep['lat']) if prep.get('clevs') is None: clevs = [0.1, 10, 25, 50, 100, 250, 600] cmap = plt.get_cmap("YlGnBu") norm = mpl.colors.BoundaryNorm(clevs, cmap.N) plots['prep'] = ax.contourf(x, y, np.squeeze(prep['data']), clevs, norm=norm, cmap=cmap, transform=datacrs) # add station points if stations is not None: plots['stations'] = ax.scatter(stations['lon'], stations['lat'], transform=ccrs.PlateCarree()) # add grid lines add_gridlines(ax) # return return plots
def fig_cldas_temp(indata, figsize=12, map_extent=(100, 125, 25, 45), gridlines=False, outfile=None, title="CLDAS Temperature", time=None): """Produce CLDAS temperature map figure. Arguments: indata {dictionary or xarray dataset} -- {'lon': 1D array, 'lat': 1D array, 'data': 2D array} Keyword Arguments: figsize {tuple or int} -- figure size (default: {12}) map_extent {tuple} -- (lonmin, lonmax, latmin, latmax) (default: {(100, 125, 25, 45)}) gridlines {bool} -- bool, draw grid lines or not. (default: {False}) outfile {string} -- save figure to outfile (default: {None}) title {string} -- figure title. time {datetime} -- analysis time. """ # check data type if isinstance(indata, xr.core.dataarray.DataArray): data = { 'lon': indata.coords['lon'].values, 'lat': indata.coords['lat'].values, 'data': np.squeeze(indata.values) } else: data = indata # set data projection datacrs = ccrs.PlateCarree() plotcrs = ccrs.AlbersEqualArea( central_latitude=(map_extent[2] + map_extent[3]) / 2.0, central_longitude=(map_extent[0] + map_extent[1]) / 2.0, standard_parallels=[30., 60.]) # set figure if isinstance(figsize, int): ratio = (map_extent[3] - map_extent[2]) / (map_extent[1] - map_extent[0]) figsize = (figsize, figsize * ratio * 0.8) fig = plt.figure(figsize=figsize) gs = mpl.gridspec.GridSpec(1, 2, width_ratios=[1, .02], bottom=.07, top=.99, hspace=0.01, wspace=0.01) ax = plt.subplot(gs[0], projection=plotcrs) # plot map background ax.set_extent(map_extent, crs=datacrs) add_china_map_2cartopy(ax, name='province', edgecolor='k', lw=1) add_china_map_2cartopy(ax, name='river', edgecolor='darkcyan', lw=1) # set color maps pos = np.array( [-45, -30, -20, -10, -5, 0, 0, 5, 5, 10, 20, 20, 30, 30, 40, 45]) colormap = cm_temperature_nws(pos) # draw CLDAS temperature x, y = np.meshgrid(data['lon'], data['lat']) pm = ax.pcolormesh(x, y, np.squeeze(data['data']), cmap=colormap, vmin=pos.min(), vmax=pos.max(), transform=datacrs) # add title plt.title(title, loc='left', fontsize=18) if time is not None: plt.title(time.strftime("%Y-%m-%dT%H"), loc='right', fontsize=18) # add grid lines if gridlines: add_gridlines(ax) # add color bar cax = plt.subplot(gs[1]) cb = plt.colorbar(pm, cax=cax, orientation='vertical', extendrect='True') cb.set_label('Temperature', size=12) # return if outfile is not None: fig.savefig(outfile) plt.close(fig) return None