def plot(self): # Read data for transection self.data_list = [] self.atr_list = [] for fname in self.file: data, atr = readfile.read(fname, datasetName=self.dset) data = pp.scale_data2disp_unit(data, metadata=atr, disp_unit=self.disp_unit)[0] self.data_list.append(data) self.atr_list.append(atr) # Figure self.fig, (self.ax_img, self.ax_txn) = plt.subplots(1, 2, num=self.figname, figsize=self.fig_size) # Axes 1 - map with view.prep/plot_slice() self.ax_img = view.plot_slice(self.ax_img, self.data_img, self.atr, self)[0] # Axes 2 - transection self.ax_txn.yaxis.tick_right() self.ax_txn.yaxis.set_label_position("right") # plot initial input transect if self.start_yx and self.end_yx: self.draw_line(self.start_yx, self.end_yx) self.draw_transection(self.start_yx, self.end_yx, self.start_lalo, self.end_lalo) self.fig.subplots_adjust(left=0.05, wspace=0.25) # save if self.save_fig: outfile = '{}.pdf'.format(self.outfile_base) self.fig.savefig(outfile, bbox_inches='tight', transparent=True, dpi=self.fig_dpi) vprint('saved transect to', outfile) self.cid = self.fig.canvas.mpl_connect('button_release_event', self.select_point) if self.disp_fig: vprint('showing ...') plt.show() return
def plot_transect(ax, inps): print('plot profiles') # disp_unit/scale if not inps.disp_unit: inps.disp_unit = inps.atrList[0]['UNIT'] inps.disp_unit, inps.disp_scale = pp.scale_data2disp_unit(data=None, metadata=inps.atrList[0], disp_unit=inps.disp_unit)[1:3] # Plot 2.1 - Input Files value_min = 0 value_max = 0 for i in range(len(inps.file)): # Profile Color based on Asc/Desc direction if inps.atrList[i]['ORBIT_DIRECTION'][0].upper() == 'A': p_color = 'crimson' else: p_color = 'royalblue' # Plot distance = inps.transectList[i][:, 0]/1000.0 # km value = inps.transectList[i][:, 1]*inps.disp_scale - inps.disp_offset*i ax.plot(distance, value, '.', color=p_color, markersize=inps.marker_size) # Y Stat value_min = np.nanmin([value_min, np.nanmin(value)]) value_max = np.nanmax([value_max, np.nanmax(value)]) # Y axis if not inps.disp_min: inps.disp_min = np.floor(value_min - (value_max-value_min)*1.2/len(inps.file)) if not inps.disp_max: inps.disp_max = np.ceil(value_max) ax.set_ylim(inps.disp_min, inps.disp_max) ax.set_ylabel('Mean LOS Velocity ({})'.format(inps.disp_unit), fontsize=inps.font_size) # X axis ax.set_xlabel('Distance (km)', fontsize=inps.font_size) ax.tick_params(which='both', direction='out', labelsize=inps.font_size) # Plot 2.2 - DEM if inps.dem: ax2 = ax.twinx() distance = inps.demTransectList[0][:, 0]/1000.0 # km value = inps.demTransectList[0][:, 1]/1000.0 # km ax2.fill_between(distance, 0, value, facecolor='gray') # Y axis - display DEM in the bottom value_min = np.nanmin(value) value_max = np.nanmax(value) if not inps.dem_disp_min: inps.dem_disp_min = np.floor(value_min*2.0)/2.0 if not inps.dem_disp_max: inps.dem_disp_max = np.ceil((value_max + (value_max-value_min)*(len(inps.file)+0.0))*2.0)/2.0 ax2.set_ylim(inps.dem_disp_min, inps.dem_disp_max) # Show lower part of yaxis #dem_tick = ax2.yaxis.get_majorticklocs() #dem_tick = dem_tick[:len(dem_tick)/2] # ax2.set_yticks(dem_tick) ax2.set_ylabel('Elevation (km)', fontsize=inps.font_size) ax2.tick_params(which='both', direction='out', labelsize=inps.font_size) # X axis - Shared distanceMax = np.nanmax(inps.transectList[0][:, 0]/1000.0) # in km plt.xlim(0, distanceMax) plt.tight_layout() return
def read_timeseries_data(inps): """Read data of time-series files Parameters: inps : Namespace of input arguments Returns: ts_data : list of 3D np.array in size of (num_date, length, width) mask : 2D np.array in size of (length, width) inps : Namespace of input arguments """ ## read list of 3D time-series ts_data = [] for fname in inps.file: msg = f'reading timeseries from file {fname}' msg += f' with step of {inps.multilook_num} by {inps.multilook_num}' if inps.multilook_num > 1 else '' vprint(msg) data, atr = readfile.read(fname, datasetName=inps.date_list, box=inps.pix_box, xstep=inps.multilook_num, ystep=inps.multilook_num) if inps.ref_yx and inps.ref_yx != (int(atr.get('REF_Y', -1)), int(atr.get('REF_X', -1))): (ry, rx) = subset_and_multilook_yx(inps.ref_yx, inps.pix_box, inps.multilook_num) ref_phase = data[:, ry, rx] data -= np.tile(ref_phase.reshape(-1, 1, 1), (1, data.shape[-2], data.shape[-1])) vprint('reference to pixel: {}'.format(inps.ref_yx)) if inps.ref_idx is not None: vprint('reference to date: {}'.format(inps.date_list[inps.ref_idx])) data -= np.tile(data[inps.ref_idx, :, :], (inps.num_date, 1, 1)) # Display Unit (data, inps.disp_unit, inps.unit_fac) = pp.scale_data2disp_unit(data, metadata=atr, disp_unit=inps.disp_unit) ts_data.append(data) ## mask file: input mask file + non-zero ts pixels - ref_point mask = pp.read_mask(inps.file[0], mask_file=inps.mask_file, datasetName='displacement', box=inps.pix_box, xstep=inps.multilook_num, ystep=inps.multilook_num, print_msg=inps.print_msg)[0] if mask is None: mask = np.ones(ts_data[0].shape[-2:], np.bool_) ts_stack = np.nansum(ts_data[0], axis=0) mask[np.isnan(ts_stack)] = False # keep all-zero value for unwrapError time-series if atr['UNIT'] not in ['cycle']: mask[ts_stack == 0.] = False del ts_stack # do not mask the reference point if inps.ref_yx and inps.ref_yx != (int(atr.get('REF_Y', -1)), int(atr.get('REF_X', -1))): (ry, rx) = subset_and_multilook_yx(inps.ref_yx, inps.pix_box, inps.multilook_num) mask[ry, rx] = True ## default vlim inps.dlim = [np.nanmin(ts_data[0]), np.nanmax(ts_data[0])] if not inps.vlim: inps.cmap_lut, inps.vlim = pp.auto_adjust_colormap_lut_and_disp_limit(ts_data[0], num_multilook=10, print_msg=inps.print_msg) vprint('data range: {} {}'.format(inps.dlim, inps.disp_unit)) vprint('display range: {} {}'.format(inps.vlim, inps.disp_unit)) ## default ylim num_file = len(inps.file) if not inps.ylim: ts_data_mli = multilook_data(np.squeeze(ts_data[-1]), 4, 4) if inps.zero_first: ts_data_mli -= np.tile(ts_data_mli[inps.zero_idx, :, :], (inps.num_date, 1, 1)) ymin, ymax = (np.nanmin(ts_data_mli[inps.ex_flag != 0]), np.nanmax(ts_data_mli[inps.ex_flag != 0])) ybuffer = (ymax - ymin) * 0.05 inps.ylim = [ymin - ybuffer, ymax + ybuffer] if inps.offset: inps.ylim[1] += inps.offset * (num_file - 1) del ts_data_mli return ts_data, mask, inps
def read_init_info(inps): # Time Series Info atr = readfile.read_attribute(inps.file[0]) inps.key = atr['FILE_TYPE'] if inps.key == 'timeseries': obj = timeseries(inps.file[0]) elif inps.key == 'giantTimeseries': obj = giantTimeseries(inps.file[0]) elif inps.key == 'HDFEOS': obj = HDFEOS(inps.file[0]) else: raise ValueError('input file is {}, not timeseries.'.format(inps.key)) obj.open(print_msg=inps.print_msg) inps.seconds = atr.get('CENTER_LINE_UTC', 0) if not inps.file_label: inps.file_label = [] for fname in inps.file: fbase = os.path.splitext(os.path.basename(fname))[0] fbase = fbase.replace('timeseries', '') inps.file_label.append(fbase) # default mask file if not inps.mask_file and 'msk' not in inps.file[0]: dir_name = os.path.dirname(inps.file[0]) if 'Y_FIRST' in atr.keys(): inps.mask_file = os.path.join(dir_name, 'geo_maskTempCoh.h5') else: inps.mask_file = os.path.join(dir_name, 'maskTempCoh.h5') if not os.path.isfile(inps.mask_file): inps.mask_file = None ## date info inps.date_list = obj.dateList inps.num_date = len(inps.date_list) if inps.start_date: inps.date_list = [i for i in inps.date_list if int(i) >= int(inps.start_date)] if inps.end_date: inps.date_list = [i for i in inps.date_list if int(i) <= int(inps.end_date)] inps.num_date = len(inps.date_list) inps.dates, inps.yearList = ptime.date_list2vector(inps.date_list) (inps.ex_date_list, inps.ex_dates, inps.ex_flag) = read_exclude_date(inps.ex_date_list, inps.date_list) # reference date/index if not inps.ref_date: inps.ref_date = atr.get('REF_DATE', None) if inps.ref_date: inps.ref_idx = inps.date_list.index(inps.ref_date) else: inps.ref_idx = None # date/index of interest for initial display if not inps.idx: if (not inps.ref_idx) or (inps.ref_idx < inps.num_date / 2.): inps.idx = inps.num_date - 2 else: inps.idx = 2 # Display Unit (inps.disp_unit, inps.unit_fac) = pp.scale_data2disp_unit(metadata=atr, disp_unit=inps.disp_unit)[1:3] # Map info - coordinate unit inps.coord_unit = atr.get('Y_UNIT', 'degrees').lower() # Read Error List inps.ts_plot_func = plot_ts_scatter inps.error_ts = None inps.ex_error_ts = None if inps.error_file: # assign plot function inps.ts_plot_func = plot_ts_errorbar # read error file error_fc = np.loadtxt(inps.error_file, dtype=bytes).astype(str) inps.error_ts = error_fc[:, 1].astype(np.float)*inps.unit_fac # update error file with exlcude date if inps.ex_date_list: e_ts = inps.error_ts[:] inps.ex_error_ts = e_ts[inps.ex_flag == 0] inps.error_ts = e_ts[inps.ex_flag == 1] # Zero displacement for 1st acquisition if inps.zero_first: inps.zero_idx = min(0, np.min(np.where(inps.ex_flag)[0])) # default lookup table file and coordinate object if not inps.lookup_file: inps.lookup_file = ut.get_lookup_file('./inputs/geometryRadar.h5') inps.coord = ut.coordinate(atr, inps.lookup_file) ## size and lalo info inps.pix_box, inps.geo_box = subset.subset_input_dict2box(vars(inps), atr) inps.pix_box = inps.coord.check_box_within_data_coverage(inps.pix_box) inps.geo_box = inps.coord.box_pixel2geo(inps.pix_box) data_box = (0, 0, int(atr['WIDTH']), int(atr['LENGTH'])) vprint('data coverage in y/x: '+str(data_box)) vprint('subset coverage in y/x: '+str(inps.pix_box)) vprint('data coverage in lat/lon: '+str(inps.coord.box_pixel2geo(data_box))) vprint('subset coverage in lat/lon: '+str(inps.geo_box)) vprint('------------------------------------------------------------------------') # calculate multilook_num # ONLY IF: # inps.multilook is True (no --nomultilook input) AND # inps.multilook_num ==1 (no --multilook-num input) # Note: inps.multilook is used for this check ONLY # Note: multilooking is only applied to the 3D data cubes and their related operations: # e.g. spatial indexing, referencing, etc. All the other variables are in the original grid # so that users get the same result as the non-multilooked version. if inps.multilook and inps.multilook_num == 1: inps.multilook_num = pp.auto_multilook_num(inps.pix_box, inps.num_date, max_memory=inps.maxMemory, print_msg=inps.print_msg) ## reference pixel if not inps.ref_lalo and 'REF_LAT' in atr.keys(): inps.ref_lalo = (float(atr['REF_LAT']), float(atr['REF_LON'])) if inps.ref_lalo: # set longitude to [-180, 180) if inps.coord_unit.lower().startswith('deg') and inps.ref_lalo[1] >= 180.: inps.ref_lalo[1] -= 360. # ref_lalo --> ref_yx if not set in cmd if not inps.ref_yx: inps.ref_yx = inps.coord.geo2radar(inps.ref_lalo[0], inps.ref_lalo[1], print_msg=False)[0:2] # use REF_Y/X if ref_yx not set in cmd if not inps.ref_yx and 'REF_Y' in atr.keys(): inps.ref_yx = (int(atr['REF_Y']), int(atr['REF_X'])) # ref_yx --> ref_lalo if in geo-coord # for plotting purpose only if inps.ref_yx and 'Y_FIRST' in atr.keys(): inps.ref_lalo = inps.coord.radar2geo(inps.ref_yx[0], inps.ref_yx[1], print_msg=False)[0:2] # do not plot native reference point if it's out of the coverage due to subset if (inps.ref_yx and 'Y_FIRST' in atr.keys() and inps.ref_yx == (int(atr.get('REF_Y',-999)), int(atr.get('REF_X',-999))) and not ( inps.pix_box[0] <= inps.ref_yx[1] < inps.pix_box[2] and inps.pix_box[1] <= inps.ref_yx[0] < inps.pix_box[3])): inps.disp_ref_pixel = False print('the native REF_Y/X is out of subset box, thus do not display') ## initial pixel coord if inps.lalo: inps.yx = inps.coord.geo2radar(inps.lalo[0], inps.lalo[1], print_msg=False)[0:2] try: inps.lalo = inps.coord.radar2geo(inps.yx[0], inps.yx[1], print_msg=False)[0:2] except: inps.lalo = None ## figure settings # Flip up-down / left-right if inps.auto_flip: inps.flip_lr, inps.flip_ud = pp.auto_flip_direction(atr, print_msg=inps.print_msg) # Transparency - Alpha if not inps.transparency: # Auto adjust transparency value when showing shaded relief DEM if inps.dem_file and inps.disp_dem_shade: inps.transparency = 0.7 else: inps.transparency = 1.0 ## display unit ans wrap # if wrap_step == 2*np.pi (default value), set disp_unit_img = radian; # otherwise set disp_unit_img = disp_unit inps.disp_unit_img = inps.disp_unit if inps.wrap: inps.range2phase = -4. * np.pi / float(atr['WAVELENGTH']) if 'cm' == inps.disp_unit.split('/')[0]: inps.range2phase /= 100. elif 'mm' == inps.disp_unit.split('/')[0]: inps.range2phase /= 1000. elif 'm' == inps.disp_unit.split('/')[0]: inps.range2phase /= 1. else: raise ValueError('un-recognized display unit: {}'.format(inps.disp_unit)) if (inps.wrap_range[1] - inps.wrap_range[0]) == 2*np.pi: inps.disp_unit_img = 'radian' inps.vlim = inps.wrap_range inps.cbar_label = 'Displacement [{}]'.format(inps.disp_unit_img) ## fit a suite of time func to the time series inps.model, inps.num_param = ts2vel.read_inps2model(inps, date_list=inps.date_list) # dense TS for plotting inps.date_list_fit = ptime.get_date_range(inps.date_list[0], inps.date_list[-1]) inps.dates_fit = ptime.date_list2vector(inps.date_list_fit)[0] inps.G_fit = time_func.get_design_matrix4time_func( date_list=inps.date_list_fit, model=inps.model, seconds=inps.seconds) return inps, atr
def read_timeseries_data(inps): """Read data of time-series files Parameters: inps : Namespace of input arguments Returns: ts_data : list of 3D np.array in size of (num_date, length, width) mask : 2D np.array in size of (length, width) inps : Namespace of input arguments """ # read list of 3D time-series ts_data = [] for fname in inps.file: vprint('reading timeseries from file {} ...'.format(fname)) data, atr = readfile.read(fname, datasetName=inps.date_list, box=inps.pix_box) try: ref_phase = data[:, inps.ref_yx[0] - inps.pix_box[1], inps.ref_yx[1] - inps.pix_box[0]] data -= np.tile(ref_phase.reshape(-1, 1, 1), (1, data.shape[-2], data.shape[-1])) vprint('reference to pixel: {}'.format(inps.ref_yx)) except: pass vprint('reference to date: {}'.format(inps.date_list[inps.ref_idx])) data -= np.tile(data[inps.ref_idx, :, :], (inps.num_date, 1, 1)) # Display Unit (data, inps.disp_unit, inps.unit_fac) = pp.scale_data2disp_unit(data, metadata=atr, disp_unit=inps.disp_unit) ts_data.append(data) # Mask file: input mask file + non-zero ts pixels - ref_point mask = np.ones(ts_data[0].shape[-2:], np.bool_) msk = pp.read_mask(inps.file[0], mask_file=inps.mask_file, datasetName='displacement', box=inps.pix_box, print_msg=inps.print_msg)[0] mask[msk == 0.] = False del msk ts_stack = np.sum(ts_data[0], axis=0) mask[ts_stack == 0.] = False mask[np.isnan(ts_stack)] = False del ts_stack #do not mask the reference point try: mask[inps.ref_yx[0] - inps.pix_box[1], inps.ref_yx[1] - inps.pix_box[0]] = True except: pass #vprint('masking data') #ts_mask = np.tile(mask, (inps.num_date, 1, 1)) #for i in range(len(ts_data)): # ts_data[i][ts_mask == 0] = np.nan # try: # ts_data[i][:, inps.ref_yx[0], inps.ref_yx[1]] = 0. # keep value on reference pixel # except: # pass #del ts_mask # default vlim inps.dlim = [np.nanmin(ts_data[0]), np.nanmax(ts_data[0])] ts_data_mli = multilook_data(np.squeeze(ts_data[0]), 10, 10) if not inps.vlim: inps.vlim = [ np.nanmin(ts_data_mli[inps.ex_flag != 0]), np.nanmax(ts_data_mli[inps.ex_flag != 0]) ] vprint('data range: {} {}'.format(inps.dlim, inps.disp_unit)) vprint('display range: {} {}'.format(inps.vlim, inps.disp_unit)) # default ylim num_file = len(inps.file) if not inps.ylim: ts_data_mli = multilook_data(np.squeeze(ts_data[-1]), 4, 4) if inps.zero_first: ts_data_mli -= np.tile(ts_data_mli[inps.zero_idx, :, :], (inps.num_date, 1, 1)) ymin, ymax = (np.nanmin(ts_data_mli[inps.ex_flag != 0]), np.nanmax(ts_data_mli[inps.ex_flag != 0])) ybuffer = (ymax - ymin) * 0.05 inps.ylim = [ymin - ybuffer, ymax + ybuffer] if inps.offset: inps.ylim[1] += inps.offset * (num_file - 1) del ts_data_mli return ts_data, mask, inps
def read_init_info(inps): # Time Series Info ts_file0 = inps.file[0] atr = readfile.read_attribute(ts_file0) inps.key = atr['FILE_TYPE'] if inps.key == 'timeseries': obj = timeseries(ts_file0) elif inps.key == 'giantTimeseries': obj = giantTimeseries(ts_file0) elif inps.key == 'HDFEOS': obj = HDFEOS(ts_file0) else: raise ValueError('input file is {}, not timeseries.'.format(inps.key)) obj.open(print_msg=inps.print_msg) if not inps.file_label: inps.file_label = [str(i) for i in list(range(len(inps.file)))] # default mask file if not inps.mask_file and 'masked' not in ts_file0: dir_name = os.path.dirname(ts_file0) if 'Y_FIRST' in atr.keys(): inps.mask_file = os.path.join(dir_name, 'geo_maskTempCoh.h5') else: inps.mask_file = os.path.join(dir_name, 'maskTempCoh.h5') if not os.path.isfile(inps.mask_file): inps.mask_file = None # date info inps.date_list = obj.dateList inps.num_date = len(inps.date_list) if inps.start_date: inps.date_list = [ i for i in inps.date_list if int(i) >= int(inps.start_date) ] if inps.end_date: inps.date_list = [ i for i in inps.date_list if int(i) <= int(inps.end_date) ] inps.num_date = len(inps.date_list) inps.dates, inps.yearList = ptime.date_list2vector(inps.date_list) (inps.ex_date_list, inps.ex_dates, inps.ex_flag) = read_exclude_date(inps.ex_date_list, inps.date_list) # initial display index #if atr['REF_DATE'] in inps.date_list: # inps.ref_idx = inps.date_list.index(atr['REF_DATE']) #else: # inps.ref_idx = 0 if inps.ref_date: inps.ref_idx = inps.date_list.index(inps.ref_date) else: inps.ref_idx = 3 if not inps.idx: if inps.ref_idx < inps.num_date / 2.: inps.idx = inps.num_date - 3 else: inps.idx = 3 # Display Unit (inps.disp_unit, inps.unit_fac) = pp.scale_data2disp_unit(metadata=atr, disp_unit=inps.disp_unit)[1:3] # Map info - coordinate unit inps.coord_unit = atr.get('Y_UNIT', 'degrees').lower() # Read Error List inps.ts_plot_func = plot_ts_scatter inps.error_ts = None inps.ex_error_ts = None if inps.error_file: # assign plot function inps.ts_plot_func = plot_ts_errorbar # read error file error_fc = np.loadtxt(inps.error_file, dtype=bytes).astype(str) inps.error_ts = error_fc[:, 1].astype(np.float) * inps.unit_fac # update error file with exlcude date if inps.ex_date_list: e_ts = inps.error_ts[:] inps.ex_error_ts = e_ts[inps.ex_flag == 0] inps.error_ts = e_ts[inps.ex_flag == 1] # Zero displacement for 1st acquisition if inps.zero_first: inps.zero_idx = min(0, np.min(np.where(inps.ex_flag)[0])) # default lookup table file if not inps.lookup_file: inps.lookup_file = ut.get_lookup_file('./inputs/geometryRadar.h5') inps.coord = ut.coordinate(atr, inps.lookup_file) # size and lalo info inps.pix_box, inps.geo_box = subset.subset_input_dict2box(vars(inps), atr) inps.pix_box = inps.coord.check_box_within_data_coverage(inps.pix_box) inps.geo_box = inps.coord.box_pixel2geo(inps.pix_box) data_box = (0, 0, int(atr['WIDTH']), int(atr['LENGTH'])) vprint('data coverage in y/x: ' + str(data_box)) vprint('subset coverage in y/x: ' + str(inps.pix_box)) vprint('data coverage in lat/lon: ' + str(inps.coord.box_pixel2geo(data_box))) vprint('subset coverage in lat/lon: ' + str(inps.geo_box)) vprint( '------------------------------------------------------------------------' ) # reference pixel if not inps.ref_lalo and 'REF_LAT' in atr.keys(): inps.ref_lalo = (float(atr['REF_LAT']), float(atr['REF_LON'])) if inps.ref_lalo: if inps.ref_lalo[1] > 180.: inps.ref_lalo[1] -= 360. inps.ref_yx = inps.coord.geo2radar(inps.ref_lalo[0], inps.ref_lalo[1], print_msg=False)[0:2] if not inps.ref_yx and 'REF_Y' in atr.keys(): inps.ref_yx = [int(atr['REF_Y']), int(atr['REF_X'])] # Initial Pixel Coord if inps.lalo: inps.yx = inps.coord.geo2radar(inps.lalo[0], inps.lalo[1], print_msg=False)[0:2] try: inps.lalo = inps.coord.radar2geo(inps.yx[0], inps.yx[1], print_msg=False)[0:2] except: inps.lalo = None # Flip up-down / left-right if inps.auto_flip: inps.flip_lr, inps.flip_ud = pp.auto_flip_direction( atr, print_msg=inps.print_msg) # Transparency - Alpha if not inps.transparency: # Auto adjust transparency value when showing shaded relief DEM if inps.dem_file and inps.disp_dem_shade: inps.transparency = 0.7 else: inps.transparency = 1.0 # display unit ans wrap # if wrap_step == 2*np.pi (default value), set disp_unit_img = radian; # otherwise set disp_unit_img = disp_unit inps.disp_unit_img = inps.disp_unit if inps.wrap: inps.range2phase = -4. * np.pi / float(atr['WAVELENGTH']) if 'cm' == inps.disp_unit.split('/')[0]: inps.range2phase /= 100. elif 'mm' == inps.disp_unit.split('/')[0]: inps.range2phase /= 1000. elif 'm' == inps.disp_unit.split('/')[0]: inps.range2phase /= 1. else: raise ValueError('un-recognized display unit: {}'.format( inps.disp_unit)) if (inps.wrap_range[1] - inps.wrap_range[0]) == 2 * np.pi: inps.disp_unit_img = 'radian' inps.vlim = inps.wrap_range inps.cbar_label = 'Displacement [{}]'.format(inps.disp_unit_img) return inps, atr