def bma_fig(fig, bma, cmap='cpt_rainbow', clim=None, clim_perc=(2, 98), bg=None, bg_perc=(2, 98), n_subplt=1, subplt=1, label=None, title=None, contour_int=None, contour_fn=None, alpha=0.5, ticks=False, scalebar=None, ds=None, shp=None, imshow_kwargs={'interpolation': 'nearest'}, cbar_kwargs={'orientation': 'vertical'}, **kwargs): #We don't use the kwargs, just there to save parsing in main if clim is None: clim = pltlib.get_clim(bma, clim_perc=clim_perc) print("Colorbar limits: %0.3f %0.3f" % (clim[0], clim[1])) #Link all subplots for zoom/pan sharex = sharey = None if len(fig.get_axes()) > 0: sharex = sharey = fig.get_axes()[0] #Hack to catch situations with only 1 subplot, but a subplot number > 1 if n_subplt == 1: subplt = 1 #One row, multiple columns ax = fig.add_subplot(1, n_subplt, subplt, sharex=sharex, sharey=sharey) #This occupies the full figure #ax = fig.add_axes([0., 0., 1., 1., ]) #ax.patch.set_facecolor('black') ax.patch.set_facecolor('white') #Set appropriate nodata value color cmap_name = cmap cmap = pltlib.cmap_setndv(cmap_name) #ax.set_title("Band %i" % subplt, fontsize=10) if title is not None: ax.set_title(title) #If a background image is provided, plot it first if bg is not None: #Note, alpha=1 is opaque, 0 completely transparent #alpha = 0.6 bg_perc = (4, 96) bg_alpha = 1.0 #bg_clim = malib.calcperc(bg, bg_perc) bg_clim = (1, 255) bg_cmap_name = 'gray' bg_cmap = pltlib.cmap_setndv(bg_cmap_name, cmap_name) #bg_cmap = plt.get_cmap(bg_cmap_name) #if 'inferno' in cmap_name: # bg_cmap.set_bad('0.5', alpha=1) #else: # bg_cmap.set_bad('k', alpha=1) #Set the overlay bad values to completely transparent, otherwise darkens the bg cmap.set_bad(alpha=0) bgplot = ax.imshow(bg, cmap=bg_cmap, clim=bg_clim, alpha=bg_alpha) imgplot = ax.imshow(bma, alpha=alpha, cmap=cmap, clim=clim, **imshow_kwargs) else: imgplot = ax.imshow(bma, cmap=cmap, clim=clim, **imshow_kwargs) gt = None if ds is not None: gt = np.array(ds.GetGeoTransform()) gt_scale_factor = min( np.array([ds.RasterYSize, ds.RasterXSize]) / np.array(bma.shape, dtype=float)) gt[1] *= gt_scale_factor gt[5] *= gt_scale_factor ds_srs = geolib.get_ds_srs(ds) if ticks: scale_ticks(ax, ds) else: pltlib.hide_ticks(ax) xres = geolib.get_res(ds)[0] else: pltlib.hide_ticks(ax) #This forces the black line outlining the image subplot to snap to the actual image dimensions #depreciated in 2.2 #ax.set_adjustable('box-forced') if cbar_kwargs: #Should set the format based on dtype of input data #cbar_kwargs['format'] = '%i' #cbar_kwargs['format'] = '%0.1f' #cbar_kwargs['orientation'] = 'horizontal' #Determine whether we need to add extend triangles to colorbar cbar_kwargs['extend'] = pltlib.get_cbar_extend(bma, clim) #Add the colorbar to the axes cbar = pltlib.add_cbar(ax, imgplot, label=label, cbar_kwargs=cbar_kwargs) #Plot contours every contour_int interval and update colorbar appropriately if contour_int is not None: if contour_fn is not None: contour_bma = iolib.fn_getma(contour_fn) contour_bma_clim = malib.calcperc(contour_bma) else: contour_bma = bma contour_bma_clim = clim #PIG bed ridge contours #bma_clim = (-1300, -300) #Jak front shear margin contours #bma_clim = (2000, 4000) contour_bma_clim = (100, 250) cstart = int(np.floor(contour_bma_clim[0] / contour_int)) * contour_int cend = int(np.ceil(contour_bma_clim[1] / contour_int)) * contour_int #Turn off dashed negative (beds are below sea level) #matplotlib.rcParams['contour.negative_linestyle'] = 'solid' clvl = np.arange(cstart, cend + 1, contour_int) contour_prop = { 'levels': clvl, 'linestyle': '-', 'linewidths': 0.5, 'alpha': 1.0 } #contours = ax.contour(contour_bma, colors='k', **contour_prop) #contour_cmap = 'gray' contour_cmap = 'gray_r' #This prevents white contours contour_cmap_clim = (0, contour_bma_clim[-1]) contours = ax.contour(contour_bma, cmap=contour_cmap, vmin=contour_cmap_clim[0], \ vmax=contour_cmap_clim[-1], **contour_prop) #Add labels ax.clabel(contours, inline=True, inline_spacing=0, fontsize=4, fmt='%i') #Update the cbar with contour locations #cbar.add_lines(contours) #cbar.set_ticks(contours.levels) #Plot shape overlay, moved code to pltlib if shp is not None: pltlib.shp_overlay(ax, ds, shp, gt=gt, color='k') if scalebar: scale_ticks(ax, ds) sb_loc = pltlib.best_scalebar_location(bma) #Force scalebar position #sb_loc = 'lower right' pltlib.add_scalebar(ax, xres, location=sb_loc) if not ticks: pltlib.hide_ticks(ax) #Set up interactive display global gbma gbma = bma global ggt ggt = gt #Clicking on a subplot will make it active for z-coordinate display fig.canvas.mpl_connect('button_press_event', onclick) fig.canvas.mpl_connect('axes_enter_event', enter_axis) #Add support for interactive z-value display ax.format_coord = format_coord
#t2_title = int(t2) t1_title = z1_date.strftime('%Y-%m-%d') t2_title = z2_date.strftime('%Y-%m-%d') axa[0].set_title(t1_title) axa[1].set_title(t2_title) axa[2].set_title('%s to %s (%0.2f yr)' % (t1_title, t2_title, dt)) #dz_clim = (-10, 10) dz_clim = (-2.0, 2.0) dz_im = axa[2].imshow(dhdt, cmap='RdBu', vmin=dz_clim[0], vmax=dz_clim[1]) for ax in axa: pltlib.hide_ticks(ax) ax.set_facecolor('k') sb_loc = pltlib.best_scalebar_location(z1) pltlib.add_scalebar(axa[0], ds_res[0], location=sb_loc) pltlib.add_cbar(axa[0], z1_im, label='Elevation (m WGS84)') pltlib.add_cbar(axa[1], z2_im, label='Elevation (m WGS84)') pltlib.add_cbar(axa[2], dz_im, label='dh/dt (m/yr)') plt.tight_layout() #Make room for suptitle plt.subplots_adjust(top=0.90) print("Saving map plot") fig_fn = os.path.join(outdir, feat_fn + '_mb_map.png') plt.savefig(fig_fn, dpi=300) print("Generating aed plot") f, axa = plt.subplots(1, 2, figsize=(6, 6)) f.suptitle(feat_fn) axa[0].plot(z1_bin_areas, z_bin_centers, label='%0.2f' % t1)
def map_plot(gf, z_bin_edges, outdir, hs=True): #print("Generating map plot") f, axa = plt.subplots(1, 3, figsize=(10, 7.5)) #f.suptitle(gf.feat_fn) alpha = 1.0 if hs: #z1_hs = geolib.gdaldem_wrapper(gf.out_z1_fn, product='hs', returnma=True, verbose=False) #z2_hs = geolib.gdaldem_wrapper(gf.out_z2_fn, product='hs', returnma=True, verbose=False) z1_hs = gf.z1_hs z2_hs = gf.z2_hs hs_clim = malib.calcperc(z2_hs, (2, 98)) z1_hs_im = axa[0].imshow(z1_hs, cmap='gray', vmin=hs_clim[0], vmax=hs_clim[1]) z2_hs_im = axa[1].imshow(z2_hs, cmap='gray', vmin=hs_clim[0], vmax=hs_clim[1]) alpha = 0.5 z1_im = axa[0].imshow(gf.z1, cmap='cpt_rainbow', vmin=z_bin_edges[0], vmax=z_bin_edges[-1], alpha=alpha) z2_im = axa[1].imshow(gf.z2, cmap='cpt_rainbow', vmin=z_bin_edges[0], vmax=z_bin_edges[-1], alpha=alpha) axa[0].contour(gf.z1, [ gf.z1_ela, ], linewidths=0.5, linestyles=':', colors='w') axa[1].contour(gf.z2, [ gf.z2_ela, ], linewidths=0.5, linestyles=':', colors='w') #t1_title = int(np.round(gf.t1)) #t2_title = int(np.round(gf.t2)) t1_title = '%0.2f' % gf.t1 t2_title = '%0.2f' % gf.t2 #t1_title = gf.t1.strftime('%Y-%m-%d') #t2_title = gf.t2.strftime('%Y-%m-%d') axa[0].set_title(t1_title) axa[1].set_title(t2_title) axa[2].set_title('%s to %s (%0.2f yr)' % (t1_title, t2_title, gf.dt)) #dz_clim = (-10, 10) dz_clim = (-2.0, 2.0) dz_im = axa[2].imshow(gf.dhdt, cmap='RdBu', vmin=dz_clim[0], vmax=dz_clim[1]) for ax in axa: pltlib.hide_ticks(ax) ax.set_facecolor('k') sb_loc = pltlib.best_scalebar_location(gf.z1) pltlib.add_scalebar(axa[0], gf.res[0], location=sb_loc) pltlib.add_cbar(axa[0], z1_im, label='Elevation (m WGS84)') pltlib.add_cbar(axa[1], z2_im, label='Elevation (m WGS84)') pltlib.add_cbar(axa[2], dz_im, label='dh/dt (m/yr)') plt.tight_layout() #Make room for suptitle #plt.subplots_adjust(top=0.90) #print("Saving map plot") fig_fn = os.path.join(outdir, gf.feat_fn + '_mb_map.png') plt.savefig(fig_fn, bbox_inches='tight', dpi=300) plt.close(f)