def __get_lons_lats_basemap_from_rpn(path=DEFAULT_PATH_FOR_GEO_DATA, vname="STBM", region_of_interest_shp=None, **bmp_kwargs): """ :param path: :param vname: :return: get basemap object for the variable in the given file """ with RPN(str(path)) as r: _ = r.variables[vname][:] proj_params = r.get_proj_parameters_for_the_last_read_rec() lons, lats = r.get_longitudes_and_latitudes_for_the_last_read_rec() rll = RotatedLatLon(**proj_params) if region_of_interest_shp is not None: mask = get_mask(lons, lats, region_of_interest_shp) delta_points = 10 i_arr, j_arr = np.where(mask >= 0.5) i_min, i_max = i_arr.min() - delta_points, i_arr.max() + delta_points j_min, j_max = j_arr.min() - delta_points, j_arr.max() + delta_points slices = (slice(i_min, i_max + 1), slice(j_min, j_max + 1)) bmp = rll.get_basemap_object_for_lons_lats(lons2d=lons[slices], lats2d=lats[slices], **bmp_kwargs) else: bmp = rll.get_basemap_object_for_lons_lats(lons2d=lons, lats2d=lats, **bmp_kwargs) return lons, lats, bmp
def __get_lons_lats_basemap_from_rpn(path=DEFAULT_PATH_FOR_GEO_DATA, vname="STBM", region_of_interest_shp=None, **bmp_kwargs): """ :param path: :param vname: :return: get basemap object for the variable in the given file """ with RPN(str(path)) as r: _ = r.variables[vname][:] proj_params = r.get_proj_parameters_for_the_last_read_rec() lons, lats = r.get_longitudes_and_latitudes_for_the_last_read_rec() rll = RotatedLatLon(**proj_params) if region_of_interest_shp is not None: mask = get_mask(lons, lats, region_of_interest_shp) delta_points = 10 i_arr, j_arr = np.where(mask >= 0.5) i_min, i_max = i_arr.min() - delta_points, i_arr.max() + delta_points j_min, j_max = j_arr.min() - delta_points, j_arr.max() + delta_points slices = (slice(i_min,i_max + 1), slice(j_min,j_max + 1)) bmp = rll.get_basemap_object_for_lons_lats(lons2d=lons[slices], lats2d=lats[slices], **bmp_kwargs) else: bmp = rll.get_basemap_object_for_lons_lats(lons2d=lons, lats2d=lats, **bmp_kwargs) return lons, lats, bmp
def get_lons_lats_basemap(rpnfile_path="", varname=None, index_subset=None): """ Get longitudes, latitudes and the basemap object corresponding to the rpn file :param rpnfile_path: :param varname: :return: """ with RPN(rpnfile_path) as r: assert isinstance(r, RPN) if varname is None: varname = next(v for v in r.get_list_of_varnames() if v not in [">>", "^^", "HY"]) r.get_first_record_for_name(varname) lons, lats = r.get_longitudes_and_latitudes_for_the_last_read_rec() nx, ny = lons.shape if index_subset is None: index_subset = IndexSubspace(i_start=0, i_end=nx - 1, j_start=0, j_end=ny - 1) rll = RotatedLatLon(**r.get_proj_parameters_for_the_last_read_rec()) bmp = rll.get_basemap_object_for_lons_lats( lons2d=lons[index_subset.get_islice(), index_subset.get_jslice()], lats2d=lats[index_subset.get_islice(), index_subset.get_jslice()]) return lons, lats, bmp
def main( path="/skynet3_rech1/huziy/geof_lake_infl_exp/geophys_Quebec_0.1deg_260x260_with_dd_v6_with_ITFS" ): r = RPN(path) varnames = ["ITFS"] ncols = 3 nrows = len(varnames) // 3 fig = plt.figure() varname_to_field = {} for vname in varnames: data = r.get_first_record_for_name(vname) varname_to_field[vname] = data data = np.ma.masked_where(data < 0, data) lons2d, lats2d = r.get_longitudes_and_latitudes_for_the_last_read_rec() params = r.get_proj_parameters_for_the_last_read_rec() print(params) rll = RotatedLatLon(**params) b = rll.get_basemap_object_for_lons_lats(lons2d, lats2d) x, y = b(lons2d, lats2d) b.drawcoastlines() img = b.pcolormesh(x, y, data) b.colorbar() fig = plt.figure() itfs = varname_to_field["ITFS"] plt.hist(itfs[itfs >= 0], bins=100) plt.show() r.close() pass
def get_lons_lats_basemap(rpnfile_path="", varname=None, index_subset=None): """ Get longitudes, latitudes and the basemap object corresponding to the rpn file :param rpnfile_path: :param varname: :return: """ with RPN(rpnfile_path) as r: assert isinstance(r, RPN) if varname is None: varname = next(v for v in r.get_list_of_varnames() if v not in [">>", "^^", "HY"]) r.get_first_record_for_name(varname) lons, lats = r.get_longitudes_and_latitudes_for_the_last_read_rec() nx, ny = lons.shape if index_subset is None: index_subset = IndexSubspace(i_start=0, i_end=nx - 1, j_start=0, j_end=ny - 1) rll = RotatedLatLon(**r.get_proj_parameters_for_the_last_read_rec()) bmp = rll.get_basemap_object_for_lons_lats(lons2d=lons[index_subset.get_islice(), index_subset.get_jslice()], lats2d=lats[index_subset.get_islice(), index_subset.get_jslice()]) return lons, lats, bmp
def get_basemap_and_coords_improved( file_path="data/CORDEX/NorthAmerica_0.44deg_CanHistoE1/Samples/NorthAmerica_0.44deg_CanHistoE1_198101/pm1950010100_00816912p", field_name="PR"): rpnobj = RPN(file_path) the_mask = rpnobj.get_first_record_for_name(field_name) # plt.figure() # plt.pcolormesh(the_mask.transpose()) # plt.show() proj_params = rpnobj.get_proj_parameters_for_the_last_read_rec() rll = RotatedLatLon(**proj_params) lons2d, lats2d = rpnobj.get_longitudes_and_latitudes_for_the_last_read_rec() basemap = rll.get_basemap_object_for_lons_lats(lons2d=lons2d, lats2d=lats2d) rpnobj.close() return basemap, lons2d, lats2d
def main(path = "/skynet3_rech1/huziy/geof_lake_infl_exp/geophys_Quebec_0.1deg_260x260_with_dd_v6_with_ITFS"): r = RPN(path) varnames = ["ITFS"] ncols = 3 nrows = len(varnames) // 3 fig = plt.figure() varname_to_field = {} for vname in varnames: data = r.get_first_record_for_name(vname) varname_to_field[vname] = data data = np.ma.masked_where(data < 0, data) lons2d, lats2d = r.get_longitudes_and_latitudes_for_the_last_read_rec() params = r.get_proj_parameters_for_the_last_read_rec() print(params) rll = RotatedLatLon(**params) b = rll.get_basemap_object_for_lons_lats(lons2d, lats2d) x, y = b(lons2d, lats2d) b.drawcoastlines() img = b.pcolormesh(x, y, data) b.colorbar() fig = plt.figure() itfs = varname_to_field["ITFS"] plt.hist(itfs[itfs >= 0], bins = 100) plt.show() r.close() pass
def get_coords_and_basemap(self): """ :return: lons2d, lats2d, basemap [based on the bathymetry file and gemclim_settings.nml] """ # Read longitudes and latitudes and create the basemap only if they are not initialized if self.lons is None: with Dataset(os.path.join(self.data_folder, self.bathymetry_file)) as ds: self.lons, self.lats = ds.variables["nav_lon"][:].transpose(), ds.variables["nav_lat"][:].transpose() import re lon1, lat1 = None, None lon2, lat2 = None, None with open(os.path.join(self.data_folder, self.proj_file)) as f: for line in f: if "Grd_xlat1" in line and "Grd_xlon1" in line: groups = re.findall(r"-?\b\d+.?\d*\b", line) lat1, lon1 = [float(s) for s in groups] if "Grd_xlat2" in line and "Grd_xlon2" in line: groups = re.findall(r"-?\b\d+.?\d*\b", line) lat2, lon2 = [float(s) for s in groups] rll = RotatedLatLon(lon1=lon1, lat1=lat1, lon2=lon2, lat2=lat2) self.basemap = rll.get_basemap_object_for_lons_lats(lons2d=self.lons, lats2d=self.lats) print(lon1, lat1, lon2, lat2) # self.basemap.drawcoastlines() # xx, yy = self.basemap(self.lons, self.lats) # self.basemap.pcolormesh(xx, yy, ds.variables["Bathymetry"][:].transpose()) # plt.show() self.lons[self.lons > 180] -= 360 return self.lons, self.lats, self.basemap
def plot_lake_fraction_field(): folder = "/home/huziy/skynet3_rech1/geof_lake_infl_exp" fName = "geophys_Quebec_0.1deg_260x260_with_dd_v6" path = os.path.join(folder, fName) rObj = RPN(path) lkf = rObj.get_first_record_for_name_and_level( varname="VF", level=3, level_kind=level_kinds.ARBITRARY) proj_params = rObj.get_proj_parameters_for_the_last_read_rec() lons2d, lats2d = rObj.get_longitudes_and_latitudes_for_the_last_read_rec() lons2d[lons2d >= 180] -= 360 rObj.close() rll = RotatedLatLon(**proj_params) margin = 20 lons2d = lons2d[margin:-margin, margin:-margin] lats2d = lats2d[margin:-margin, margin:-margin] lkf = lkf[margin:-margin, margin:-margin] basemap = rll.get_basemap_object_for_lons_lats(lons2d=lons2d, lats2d=lats2d, resolution="l") x, y = basemap(lons2d, lats2d) fig = plt.figure() gs = GridSpec(1, 2, width_ratios=[1, 1]) ax = fig.add_subplot(gs[0, 0]) df = 0.1 levels = np.arange(0, 1.1, df) cMap = get_cmap("gist_ncar_r", len(levels) - 1) bn = BoundaryNorm(levels, cMap.N) basemap.drawmapboundary(fill_color="0.75") lkf_plot = maskoceans(lons2d, lats2d, lkf, inlands=False) print("Percentage of lakes in the sim domain: {}".format(lkf_plot.mean() * 100)) img = basemap.pcolormesh(x, y, lkf_plot, norm=bn, cmap=cMap) basemap.drawcoastlines() divider = make_axes_locatable(ax) cax = divider.append_axes("bottom", "5%", pad="3%") cb = fig.colorbar(img, cax=cax, ticks=levels, orientation="horizontal") ax = fig.add_subplot(gs[0, 1]) df1 = df levels1 = np.arange(0, 1.1, df1) cell_numms = np.zeros((len(levels1) - 1, )) left = levels[0] right = levels[1] lefts = [] rights = [] lkf_land = lkf[lkf > 0.01] for i in range(len(cell_numms)): cell_numms[i] = ((lkf_land > left) & (lkf_land <= right)).astype(int).sum() lefts.append(left) rights.append(right) left += df1 right += df1 assert isinstance(ax, Axes) ax.bar(lefts, cell_numms, width=df1) # ax.semilogy(rights, cell_numms) ax.xaxis.set_ticks(levels) ax.yaxis.set_ticks(np.arange(1000, 10000, 1000)) sf = ScalarFormatter(useMathText=True) sf.set_powerlimits([-2, 1]) ax.yaxis.set_major_formatter(sf) ax.grid("on") ax.set_xlabel("fraction") ax.set_ylabel("# gridcells") plt.show() fig.tight_layout() fig.savefig("lake_fractions_220x220_0.1deg.jpeg") plt.show() pass
def get_coords_and_basemap(self, subregion=None, reload=True, **basemap_kwargs): """ :return: lons2d, lats2d, basemap [based on the bathymetry file and gemclim_settings.nml] if reload is True, do not use cached arrays even if they are available """ # Read longitudes and latitudes and create the basemap only if they are not initialized if self.basemap is None or reload: with Dataset(os.path.join(self.data_folder, self.bathymetry_file)) as ds: if "nav_lon" in ds.variables: self.lons, self.lats = ds.variables[ "nav_lon"][:].transpose( ), ds.variables["nav_lat"][:].transpose() else: for vname, v in ds.variables.items(): if "lon" in vname.lower(): self.lons = v[:].T continue if "lat" in vname.lower(): self.lats = v[:].T continue if self.lons is not None and self.lats is not None: break import re lon1, lat1 = None, None lon2, lat2 = None, None with open(os.path.join(self.data_folder, self.proj_file)) as f: for line in f: if "Grd_xlat1" in line and "Grd_xlon1" in line: groups = re.findall(r"-?\b\d+.?\d*\b", line) lat1, lon1 = [float(s) for s in groups] if "Grd_xlat2" in line and "Grd_xlon2" in line: groups = re.findall(r"-?\b\d+.?\d*\b", line) lat2, lon2 = [float(s) for s in groups] rll = RotatedLatLon(lon1=lon1, lat1=lat1, lon2=lon2, lat2=lat2) nx, ny = self.lons.shape if subregion is not None: ill, iur, jll, jur = int(nx * subregion[0]), int( nx * subregion[1]), int(ny * subregion[2]), int( ny * subregion[3]) else: ill, iur, jll, jur = 0, self.lons.shape[ 0], 0, self.lons.shape[1] self.basemap = rll.get_basemap_object_for_lons_lats( lons2d=self.lons[ill:iur, jll:jur], lats2d=self.lats[ill:iur, jll:jur], **basemap_kwargs) print(lon1, lat1, lon2, lat2) # self.basemap.drawcoastlines() # xx, yy = self.basemap(self.lons, self.lats) # self.basemap.pcolormesh(xx, yy, ds.variables["Bathymetry"][:].transpose()) # plt.show() self.lons[self.lons > 180] -= 360 return self.lons, self.lats, self.basemap
def main(): #path = "/RECH/data/Simulations/CRCM5/North_America/NorthAmerica_0.44deg_ERA40-Int_B1/Diagnostics/NorthAmerica_0.44deg_ERA40-Int_B1_2007{:02d}" path = "/RESCUE/skynet3_rech1/huziy/from_guillimin/new_outputs/current_climate_30_yr_sims/quebec_0.1_crcm5-hcd-rl-intfl_ITFS/Samples/quebec_crcm5-hcd-rl-intfl_1988{:02d}" months = [6, 7, 8] pm_list = [] dm_list = [] for m in months: print(path.format(m)) month_folder = path.format(m) for fn in os.listdir(month_folder): # if not fn.endswith("moyenne"): # continue if fn.startswith("pm"): pm_list.append(os.path.join(month_folder, fn)) elif fn.startswith("dm"): dm_list.append(os.path.join(month_folder, fn)) pm = MultiRPN(pm_list) dm = MultiRPN(dm_list) tsurf_mean = np.mean([ field for field in pm.get_all_time_records_for_name_and_level( varname="J8").values() ], axis=0) tair_mean = np.mean([ field for field in dm.get_all_time_records_for_name_and_level( varname="TT", level=1, level_kind=level_kinds.HYBRID).values() ], axis=0) lons, lats = pm.get_longitudes_and_latitudes_of_the_last_read_rec() projparams = pm.linked_robj_list[ 0].get_proj_parameters_for_the_last_read_rec() rll = RotatedLatLon(**projparams) bmp = rll.get_basemap_object_for_lons_lats(lons2d=lons, lats2d=lats) xx, yy = bmp(lons, lats) plt.figure() cs = bmp.contourf(xx, yy, tsurf_mean - 273.15, 40) bmp.drawcoastlines() plt.title("Tsurf") plt.colorbar() plt.figure() bmp.contourf(xx, yy, tair_mean, levels=cs.levels, norm=cs.norm, cmap=cs.cmap) bmp.drawcoastlines() plt.title("Tair") plt.colorbar() plt.figure() bmp.contourf(xx, yy, tsurf_mean - 273.15 - tair_mean, levels=np.arange(-2, 2.2, 0.2), cmap=cs.cmap) bmp.drawcoastlines() plt.title("Tsurf - Tair") plt.colorbar() pm.close() dm.close() plt.show()
def main(): """ """ # s_lons = [-3.38, 3.40, -12.45, -11.04,-2.92, 0.1,32.55,30.48,23.6,31.27,15.31,23.91,17.51,21.08] # s_lats = [16.26,11.88,14.9,13.91,10.57,6.2,15.61,19.18,-14.02,-21.13,-4.26,4.97,-28.71,-28.69] # assert len(s_lons) == len(s_lats) #path = "data/directions_Africa_Bessam_0.44/infocell_Africa.nc" #path = "/home/huziy/skynet3_exec1/for_offline_routing/directions_africa_dx0.44deg_2.nc" path = "/skynet3_rech1/huziy/for_Arman_routing_data/infocell_na_0.44deg_arman.nc" ds = Dataset(path) dirs = ds.variables["flow_direction_value"][:] acc_area = ds.variables["accumulation_area"][:] lons2d = ds.variables["lon"][:] lats2d = ds.variables["lat"][:] lon_1, lat_1 = -97, 47.5 lon_2, lat_2 = -7, 0 lons2d[lons2d >= 180] -= 360 #min_lon = lons2d[0,0] #max_lon = lons2d[-1,-1] #min_lat = lats2d[0, 0] #max_lat = lats2d[-1,-1] #plot_utils.apply_plot_params(width_pt=None, width_cm=80) #print max_lon fig = plt.figure(dpi=800) #TODO: change projection to rotpole (it will require params) #b = Basemap(projection="rotpole", llcrnrlon=min_lon, # llcrnrlat=min_lat, # urcrnrlon=max_lon, urcrnrlat=max_lat, resolution="i") myproj = RotatedLatLon(lon1=lon_1, lat1=lat_1, lon2=lon_2, lat2=lat_2) print(lons2d.shape) b = myproj.get_basemap_object_for_lons_lats(lons2d[100:150, 70:132], lats2d[100:150, 70:132]) x, y = b(lons2d, lats2d) b.drawcoastlines(linewidth=0.2, color="0.5") # b.pcolormesh(x, y, np.ma.masked_where(dirs <= 0, dirs )) # plt.colorbar() di_list = np.array([1, 1, 0, -1, -1, -1, 0, 1]) dj_list = np.array([0, -1, -1, -1, 0, 1, 1, 1]) delta_indices = np.log2(dirs[dirs > 0]) delta_indices = delta_indices.astype(int) di = di_list[delta_indices] dj = dj_list[delta_indices] acc_area = np.ma.masked_where(acc_area < 0, acc_area) #img = b.pcolormesh(x, y, np.ma.log(acc_area)) ax = plt.gca() #divider = make_axes_locatable(ax) #cax = divider.append_axes("right", "5%", pad="3%") #plt.colorbar(img, cax = cax) i_indices_1d = list(range(dirs.shape[0])) j_indices_1d = list(range(dirs.shape[1])) j_indices_2d, i_indices_2d = np.meshgrid(j_indices_1d, i_indices_1d) i_indices_2d_next = np.zeros_like(i_indices_2d) j_indices_2d_next = np.zeros_like(i_indices_2d) i_indices_2d_next[dirs > 0] = i_indices_2d[dirs > 0] + di j_indices_2d_next[dirs > 0] = j_indices_2d[dirs > 0] + dj for i, j, i_next, j_next in zip(i_indices_2d[dirs > 0], j_indices_2d[dirs > 0], i_indices_2d_next[dirs > 0], j_indices_2d_next[dirs > 0]): # ax.add_line(Line2D([x[i,j], x[i_next, j_next]], [y[i,j], y[i_next, j_next]], linewidth=0.5)) if i == i_next and j == j_next: continue p1 = [x[i, j], y[i, j]] p2 = [x[i_next, j_next], y[i_next, j_next]] dr = [p2[0] - p1[0], p2[1] - p1[1]] ax.add_patch(FancyArrow(p1[0], p1[1], dr[0], dr[1], linewidth=0.5, fc="k", head_width=0.1, length_includes_head=True)) # x1, y1 = b(s_lons, s_lats) # b.scatter(x1, y1, c="r", linewidth=0, zorder = 7, ax = ax) # b.drawrivers(linewidth=0.5, color="#0cf5f8", zorder=8, ax=ax) # b.drawmeridians(np.arange(-10, 90,30)) # b.drawparallels(np.arange(-50, 40, 5), labels=[1,1,1,1], linewidth=0.1) plt.tight_layout() # plt.show() #b.readshapefile("/home/huziy/skynet3_exec1/other_shape/af_major_basins/af_basins", "basin", # linewidth=3, zorder=9, ax=ax #) plt.savefig("with_station_riv_af_dirs_basin_1.0.eps") pass
def plot_acc_area_with_glaciers(): gmask_vname = "VF" gmask_level = 2 # gmask_path = "/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/geophys_West_NA_0.25deg_144x115_GLNM_PRSF_CanHR85" gmask_path = "/RESCUE/skynet3_rech1/huziy/CNRCWP/Calgary_flood/geophys_CORDEX_NA_0.11deg_695x680_filled_grDes_barBor_Crop2Gras_peat" # stab reading of the glacier mask # r = RPN(gmask_path) # gmask = r.get_first_record_for_name_and_level(varname=gmask_vname, # level=gmask_level) r = RPN("/RESCUE/skynet3_rech1/huziy/CNRCWP/Calgary_flood/pm2013061400_00000000p") r.get_first_record_for_name("PR") # Because I almost sure that PR is there proj_params = r.get_proj_parameters_for_the_last_read_rec() rll = RotatedLatLon(**proj_params) lons, lats = r.get_longitudes_and_latitudes_for_the_last_read_rec() basemap = rll.get_basemap_object_for_lons_lats(lons2d=lons, lats2d=lats, resolution="i") # gmask = np.ma.masked_where(gmask < 0.01, gmask) gmask = np.ma.masked_all(lons.shape) mask_value = 0.25 gmask[~gmask.mask] = mask_value path = "/RESCUE/skynet3_rech1/huziy/Netbeans Projects/Java/DDM/directions_WestCaUs_dx0.11deg.nc" # path = "/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/infocell_West_NA_0.25deg_104x75_GLNM_PRSF_CanHR85_104x75.nc" ds = Dataset(path) margin = 20 var_name = "accumulation_area" data = ds.variables[var_name][margin:-margin, margin:-margin] data = np.ma.masked_where(data <= 0, data) # flow directions fldr = ds.variables["flow_direction_value"][:][margin:-margin, margin:-margin] i_shifts, j_shifts = direction_and_value.flowdir_values_to_shift(fldr) x, y = basemap(lons, lats) fig = plt.figure(figsize=(15, 15)) dx = (x[-1, -1] - x[0, 0]) / float(x.shape[0]) dy = (y[-1, -1] - y[0, 0]) / float(y.shape[1]) x1 = x - dx / 2.0 y1 = y - dy / 2.0 # im = basemap.pcolormesh(x1, y1, data, norm=LogNorm(vmin=1e3, vmax=1e7), cmap=cm.get_cmap("jet", 12)) # cb = basemap.colorbar(im) # cb.ax.tick_params(labelsize=25) cmap = cm.get_cmap("gray_r", 10) basemap.pcolormesh(x1, y1, gmask, cmap=cmap, vmin=0., vmax=1.) nx, ny = x.shape inds_j, inds_i = np.meshgrid(range(ny), range(nx)) inds_i_next = inds_i + i_shifts inds_j_next = inds_j + j_shifts inds_i_next = np.ma.masked_where((inds_i_next == nx) | (inds_i_next == -1), inds_i_next) inds_j_next = np.ma.masked_where((inds_j_next == ny) | (inds_j_next == -1), inds_j_next) u = np.ma.masked_all_like(x) v = np.ma.masked_all_like(x) good = (~inds_i_next.mask) & (~inds_j_next.mask) u[good] = x[inds_i_next[good], inds_j_next[good]] - x[inds_i[good], inds_j[good]] v[good] = y[inds_i_next[good], inds_j_next[good]] - y[inds_i[good], inds_j[good]] basemap.quiver(x, y, u, v, pivot="tail", width=0.0005, scale_units="xy", headlength=20, headwidth=15, scale=1) basemap.drawcoastlines(linewidth=0.5) basemap.drawrivers(color="b") # plt.legend([Rectangle((0, 0), 5, 5, fc=cmap(mask_value)), ], ["Glaciers", ], loc=3) # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/athabasca/athabasca_dissolved", "atabaska", # zorder=2, linewidth=3, color="m") # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/fraizer/fraizer", "frazier", # zorder=2, linewidth=3, color="m") # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/South_sas/South_sas_dissolved", "south_sask", # zorder=2, linewidth=3, color="m") # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/north_sas/north_sas", "north_sask", # zorder=2, linewidth=3, color="m") # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/watersheds_up_sas/watershed_up_sas_proj", # "upsas", # zorder=2, linewidth=3, color="m") # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/network/network", "rivers", # zorder=2, linewidth=0.5, color="b") # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/network_up_sas/network_up_sout_sas_proj", "network", # zorder=2, linewidth=0.5, color="b") basemap.readshapefile("/skynet3_exec2/aganji/NE_can/bow_river/bow_projected", "basin", color="m", linewidth=2) # plt.savefig("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/directions.png", bbox_inches="tight") plt.savefig("/RESCUE/skynet3_rech1/huziy/CNRCWP/Calgary_flood/directions.png", bbox_inches="tight") plt.show()
def get_coords_and_basemap(self, subregion=None, reload=True, **basemap_kwargs): """ :return: lons2d, lats2d, basemap [based on the bathymetry file and gemclim_settings.nml] if reload is True, do not use cached arrays even if they are available """ # Read longitudes and latitudes and create the basemap only if they are not initialized if self.basemap is None or reload: with Dataset(os.path.join(self.data_folder, self.bathymetry_file)) as ds: if "nav_lon" in ds.variables: self.lons, self.lats = ds.variables["nav_lon"][:].transpose(), ds.variables["nav_lat"][:].transpose() else: for vname, v in ds.variables.items(): if "lon" in vname.lower(): self.lons = v[:].T continue if "lat" in vname.lower(): self.lats = v[:].T continue if self.lons is not None and self.lats is not None: break import re lon1, lat1 = None, None lon2, lat2 = None, None with open(os.path.join(self.data_folder, self.proj_file)) as f: for line in f: if "Grd_xlat1" in line and "Grd_xlon1" in line: groups = re.findall(r"-?\b\d+.?\d*\b", line) lat1, lon1 = [float(s) for s in groups] if "Grd_xlat2" in line and "Grd_xlon2" in line: groups = re.findall(r"-?\b\d+.?\d*\b", line) lat2, lon2 = [float(s) for s in groups] rll = RotatedLatLon(lon1=lon1, lat1=lat1, lon2=lon2, lat2=lat2) nx, ny = self.lons.shape if subregion is not None: ill, iur, jll, jur = int(nx * subregion[0]), int(nx * subregion[1]), int(ny * subregion[2]), int(ny * subregion[3]) else: ill, iur, jll, jur = 0, self.lons.shape[0], 0, self.lons.shape[1] self.basemap = rll.get_basemap_object_for_lons_lats(lons2d=self.lons[ill:iur, jll:jur], lats2d=self.lats[ill:iur, jll:jur], **basemap_kwargs) print(lon1, lat1, lon2, lat2) # self.basemap.drawcoastlines() # xx, yy = self.basemap(self.lons, self.lats) # self.basemap.pcolormesh(xx, yy, ds.variables["Bathymetry"][:].transpose()) # plt.show() self.lons[self.lons > 180] -= 360 return self.lons, self.lats, self.basemap
def main(): # plot_utils.apply_plot_params(20) folder = "/home/huziy/skynet3_rech1/from_guillimin" fname = "geophys_Quebec_0.1deg_260x260_with_dd_v6" path = os.path.join(folder, fname) rObj = RPN(path) mg = rObj.get_first_record_for_name_and_level("MG", level=0, level_kind=level_kinds.PRESSURE) # j2 = rObj.get_first_record_for_name("J2") levs = [0, 100, 200, 300, 500, 700, 1000, 1500, 2000, 2800] norm = BoundaryNorm(levs, len(levs) - 1) me = rObj.get_first_record_for_name_and_level("ME", level=0, level_kind=level_kinds.ARBITRARY) proj_params = rObj.get_proj_parameters_for_the_last_read_rec() print(me.shape) lons2d, lats2d = rObj.get_longitudes_and_latitudes_for_the_last_read_rec() lons2d[lons2d > 180] -= 360 # me_to_plot = np.ma.masked_where(mg < 0.4, me) me_to_plot = me # print me_to_plot.min(), me_to_plot.max() rll = RotatedLatLon(**proj_params) basemap = rll.get_basemap_object_for_lons_lats(lons2d=lons2d, lats2d=lats2d) rObj.close() x, y = basemap(lons2d, lats2d) plt.figure() ax = plt.gca() # the_cmap = cm.get_cmap(name = "gist_earth", lut=len(levs) -1) # the_cmap = my_colormaps.get_cmap_from_ncl_spec_file(path="colormap_files/topo_15lev.rgb") the_cmap = my_colormaps.get_cmap_from_ncl_spec_file( path="colormap_files/OceanLakeLandSnow.rgb", ncolors=len(levs) - 1 ) # new_cm = matplotlib.colors.LinearSegmentedColormap('colormap',new_dict,len(levs) - 1) me_to_plot = maskoceans(lons2d, lats2d, me_to_plot, resolution="l") basemap.contourf(x, y, me_to_plot, cmap=the_cmap, levels=levs, norm=norm) # basemap.fillcontinents(color = "none", lake_color="aqua") basemap.drawmapboundary(fill_color="#479BF9") basemap.drawcoastlines(linewidth=0.5) basemap.drawmeridians(np.arange(-180, 180, 20), labels=[1, 0, 0, 1]) basemap.drawparallels(np.arange(45, 75, 15), labels=[1, 0, 0, 1]) basemap.readshapefile("data/shape/contour_bv_MRCC/Bassins_MRCC_latlon", name="basin", linewidth=1) divider = make_axes_locatable(ax) cax = divider.append_axes("right", "5%", pad="3%") plt.colorbar(ticks=levs, cax=cax) # basemap.scatter(x, y, color="k", s=1, linewidths=0, ax=ax, zorder=2) margin = 20 x1 = x[margin, margin] x2 = x[-margin, margin] y1 = y[margin, margin] y2 = y[margin, -margin] pol_corners = ((x1, y1), (x2, y1), (x2, y2), (x1, y2)) ax.add_patch(Polygon(xy=pol_corners, fc="none", ls="dashed", lw=3)) # plt.tight_layout() # plt.show() plt.savefig("free_domain_260x260.png", dpi=cpp.FIG_SAVE_DPI) pass
def plot_acc_area_with_glaciers( gmask_vname: str = "VF", gmask_level=2, gmask_path="/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/geophys_West_NA_0.25deg_144x115_GLNM_PRSF_CanHR85", route_data_path="/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/directions_north_america_0.25deg_glaciers.nc", lons_target=None, lats_target=None, basin_shape_files=None): plot_scatter = False # stab reading of the glacier mask with RPN(gmask_path) as r: gmask = r.get_first_record_for_name_and_level(varname=gmask_vname, level=gmask_level) # r = RPN("/RESCUE/skynet3_rech1/huziy/CNRCWP/Calgary_flood/pm2013061400_00000000p") r.get_first_record_for_name( "VF") # Because I almost sure that PR is there proj_params = r.get_proj_parameters_for_the_last_read_rec() rll = RotatedLatLon(**proj_params) lons_gmask, lats_gmask = r.get_longitudes_and_latitudes_for_the_last_read_rec( ) gl_fraction_limit = 0.01 gmask = np.ma.masked_where(gmask < gl_fraction_limit, gmask) mask_value = 0.25 gmask[~gmask.mask] = mask_value if str(route_data_path).endswith(".nc"): print("route_data_path ends with .nc => assuming netcdf format: {}". format(route_data_path)) with Dataset(route_data_path) as ds: var_name = "accumulation_area" data = ds.variables[var_name][:] # flow directions fldr = ds.variables["flow_direction_value"][:] coord_names = ["lon", "lat"] if "lon" in ds.variables else [ "longitudes", "latitudes" ] lons_route, lats_route = [ds.variables[k] for k in coord_names] else: print( "route_data_path does not end with .nc => assuming rpn format: {}". format(route_data_path)) with RPN(route_data_path) as r: data = r.get_first_record_for_name("FACC") fldr = r.get_first_record_for_name("FLDR") lons_route, lats_route = r.get_longitudes_and_latitudes_for_the_last_read_rec( ) # do the spatial interpolation if required xg, yg, zg = lat_lon.lon_lat_to_cartesian(lons_gmask.flatten(), lats_gmask.flatten()) xr, yr, zr = lat_lon.lon_lat_to_cartesian(lons_route.flatten(), lats_route.flatten()) if lons_target is None or lats_target is None: lons_target, lats_target = lons_route, lats_route xt, yt, zt = xr, yr, zr else: xt, yt, zt = lat_lon.lon_lat_to_cartesian(lons_target.flatten(), lats_target.flatten()) basemap = rll.get_basemap_object_for_lons_lats(lons2d=lons_target, lats2d=lats_target, resolution="i") ktree_route = KDTree(list(zip(xr, yr, zr))) dists_route, inds_route = ktree_route.query(list(zip(xt, yt, zt))) data = data.flatten()[inds_route].reshape(lons_target.shape) fldr = fldr.flatten()[inds_route].reshape(lons_target.shape) ktree_gmask = KDTree(list(zip(xg, yg, zg))) dists_gmask, inds_gmask = ktree_gmask.query(list(zip(xt, yt, zt))) gmask = gmask.flatten()[inds_gmask].reshape(lons_target.shape) data = np.ma.masked_where(data <= 0, data) i_shifts, j_shifts = direction_and_value.flowdir_values_to_shift(fldr) xx, yy = basemap(lons_target, lats_target) fig = plt.figure(figsize=(15, 15)) dx = (xx[-1, -1] - xx[0, 0]) / float(xx.shape[0]) dy = (yy[-1, -1] - yy[0, 0]) / float(yy.shape[1]) x1 = xx - dx / 2.0 y1 = yy - dy / 2.0 # Uncomment to plot the accumulation areas im = basemap.pcolormesh(x1, y1, data, norm=LogNorm(vmin=1e3, vmax=1e7), cmap=cm.get_cmap("jet", 12)) cb = basemap.colorbar(im) cmap = cm.get_cmap("gray_r", 10) basemap.pcolormesh(x1, y1, gmask, cmap=cmap, vmin=0., vmax=1.) nx, ny = xx.shape inds_j, inds_i = np.meshgrid(range(ny), range(nx)) inds_i_next = inds_i + i_shifts inds_j_next = inds_j + j_shifts inds_i_next = np.ma.masked_where((inds_i_next == nx) | (inds_i_next == -1), inds_i_next) inds_j_next = np.ma.masked_where((inds_j_next == ny) | (inds_j_next == -1), inds_j_next) u = np.ma.masked_all_like(xx) v = np.ma.masked_all_like(xx) good = (~inds_i_next.mask) & (~inds_j_next.mask) u[good] = xx[inds_i_next[good], inds_j_next[good]] - xx[inds_i[good], inds_j[good]] v[good] = yy[inds_i_next[good], inds_j_next[good]] - yy[inds_i[good], inds_j[good]] basemap.quiver(xx, yy, u, v, pivot="tail", width=0.0005, scale_units="xy", headlength=20, headwidth=15, scale=1) basemap.drawcoastlines(linewidth=0.5, zorder=5) basemap.drawrivers(color="lightcoral", zorder=5, linewidth=3) plt.legend([ Rectangle((0, 0), 5, 5, fc=cmap(mask_value)), ], [ r"Glacier ($\geq {}\%$)".format(gl_fraction_limit * 100), ], loc=3) watershed_bndry_width = 4 if basin_shape_files is not None: for i, the_shp in enumerate(basin_shape_files): basemap.readshapefile(the_shp[:-4], "basin_{}".format(i), zorder=2, color="m", linewidth=watershed_bndry_width) # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/athabasca/athabasca_dissolved", "atabaska", # zorder=2, linewidth=watershed_bndry_width, color="m") # # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/fraizer/fraizer", "frazier", # zorder=2, linewidth=watershed_bndry_width, color="m") # # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/South_sas/South_sas_dissolved", "south_sask", # zorder=2, linewidth=watershed_bndry_width, color="m") # # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/north_sas/north_sas", "north_sask", # zorder=2, linewidth=watershed_bndry_width, color="m") # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/watersheds_up_sas/watershed_up_sas_proj", # "upsas", # zorder=2, linewidth=3, color="m") # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/network/network", "rivers", # zorder=2, linewidth=0.5, color="b") # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/network_up_sas/network_up_sout_sas_proj", "network", # zorder=2, linewidth=0.5, color="b") if plot_scatter: points_lat = [51.54, 49.2476] points_lon = [-122.277, -122.784] point_x, point_y = basemap(points_lon, points_lat) basemap.scatter(point_x, point_y, c="g", s=20, zorder=3) plt.savefig("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/directions_only.png", bbox_inches="tight", dpi=300) # plt.savefig("/RESCUE/skynet3_rech1/huziy/CNRCWP/Calgary_flood/directions.png", bbox_inches="tight") plt.show()
def plot_acc_area_with_glaciers(): gmask_vname = "VF" gmask_level = 2 # gmask_path = "/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/geophys_West_NA_0.25deg_144x115_GLNM_PRSF_CanHR85" gmask_path = "/RESCUE/skynet3_rech1/huziy/CNRCWP/Calgary_flood/geophys_CORDEX_NA_0.11deg_695x680_filled_grDes_barBor_Crop2Gras_peat" # stab reading of the glacier mask # r = RPN(gmask_path) # gmask = r.get_first_record_for_name_and_level(varname=gmask_vname, # level=gmask_level) r = RPN( "/RESCUE/skynet3_rech1/huziy/CNRCWP/Calgary_flood/pm2013061400_00000000p" ) r.get_first_record_for_name("PR") # Because I almost sure that PR is there proj_params = r.get_proj_parameters_for_the_last_read_rec() rll = RotatedLatLon(**proj_params) lons, lats = r.get_longitudes_and_latitudes_for_the_last_read_rec() basemap = rll.get_basemap_object_for_lons_lats(lons2d=lons, lats2d=lats, resolution="i") # gmask = np.ma.masked_where(gmask < 0.01, gmask) gmask = np.ma.masked_all(lons.shape) mask_value = 0.25 gmask[~gmask.mask] = mask_value path = "/RESCUE/skynet3_rech1/huziy/Netbeans Projects/Java/DDM/directions_WestCaUs_dx0.11deg.nc" # path = "/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/infocell_West_NA_0.25deg_104x75_GLNM_PRSF_CanHR85_104x75.nc" ds = Dataset(path) margin = 20 var_name = "accumulation_area" data = ds.variables[var_name][margin:-margin, margin:-margin] data = np.ma.masked_where(data <= 0, data) # flow directions fldr = ds.variables["flow_direction_value"][:][margin:-margin, margin:-margin] i_shifts, j_shifts = direction_and_value.flowdir_values_to_shift(fldr) x, y = basemap(lons, lats) fig = plt.figure(figsize=(15, 15)) dx = (x[-1, -1] - x[0, 0]) / float(x.shape[0]) dy = (y[-1, -1] - y[0, 0]) / float(y.shape[1]) x1 = x - dx / 2.0 y1 = y - dy / 2.0 # im = basemap.pcolormesh(x1, y1, data, norm=LogNorm(vmin=1e3, vmax=1e7), cmap=cm.get_cmap("jet", 12)) # cb = basemap.colorbar(im) # cb.ax.tick_params(labelsize=25) cmap = cm.get_cmap("gray_r", 10) basemap.pcolormesh(x1, y1, gmask, cmap=cmap, vmin=0., vmax=1.) nx, ny = x.shape inds_j, inds_i = np.meshgrid(range(ny), range(nx)) inds_i_next = inds_i + i_shifts inds_j_next = inds_j + j_shifts inds_i_next = np.ma.masked_where((inds_i_next == nx) | (inds_i_next == -1), inds_i_next) inds_j_next = np.ma.masked_where((inds_j_next == ny) | (inds_j_next == -1), inds_j_next) u = np.ma.masked_all_like(x) v = np.ma.masked_all_like(x) good = (~inds_i_next.mask) & (~inds_j_next.mask) u[good] = x[inds_i_next[good], inds_j_next[good]] - x[inds_i[good], inds_j[good]] v[good] = y[inds_i_next[good], inds_j_next[good]] - y[inds_i[good], inds_j[good]] basemap.quiver(x, y, u, v, pivot="tail", width=0.0005, scale_units="xy", headlength=20, headwidth=15, scale=1) basemap.drawcoastlines(linewidth=0.5) basemap.drawrivers(color="b") # plt.legend([Rectangle((0, 0), 5, 5, fc=cmap(mask_value)), ], ["Glaciers", ], loc=3) # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/athabasca/athabasca_dissolved", "atabaska", # zorder=2, linewidth=3, color="m") # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/fraizer/fraizer", "frazier", # zorder=2, linewidth=3, color="m") # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/South_sas/South_sas_dissolved", "south_sask", # zorder=2, linewidth=3, color="m") # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/north_sas/north_sas", "north_sask", # zorder=2, linewidth=3, color="m") # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/watersheds_up_sas/watershed_up_sas_proj", # "upsas", # zorder=2, linewidth=3, color="m") # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/network/network", "rivers", # zorder=2, linewidth=0.5, color="b") # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/network_up_sas/network_up_sout_sas_proj", "network", # zorder=2, linewidth=0.5, color="b") basemap.readshapefile( "/skynet3_exec2/aganji/NE_can/bow_river/bow_projected", "basin", color="m", linewidth=2) # plt.savefig("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/directions.png", bbox_inches="tight") plt.savefig( "/RESCUE/skynet3_rech1/huziy/CNRCWP/Calgary_flood/directions.png", bbox_inches="tight") plt.show()
def main(): #path = "/RECH/data/Simulations/CRCM5/North_America/NorthAmerica_0.44deg_ERA40-Int_B1/Diagnostics/NorthAmerica_0.44deg_ERA40-Int_B1_2007{:02d}" path = "/RESCUE/skynet3_rech1/huziy/from_guillimin/new_outputs/current_climate_30_yr_sims/quebec_0.1_crcm5-hcd-rl-intfl_ITFS/Samples/quebec_crcm5-hcd-rl-intfl_1988{:02d}" months = [6, 7, 8] pm_list = [] dm_list = [] for m in months: print(path.format(m)) month_folder = path.format(m) for fn in os.listdir(month_folder): # if not fn.endswith("moyenne"): # continue if fn.startswith("pm"): pm_list.append(os.path.join(month_folder, fn)) elif fn.startswith("dm"): dm_list.append(os.path.join(month_folder, fn)) pm = MultiRPN(pm_list) dm = MultiRPN(dm_list) tsurf_mean = np.mean([field for field in pm.get_all_time_records_for_name_and_level(varname="J8").values()], axis=0) tair_mean = np.mean([field for field in dm.get_all_time_records_for_name_and_level(varname="TT", level=1, level_kind=level_kinds.HYBRID).values()], axis=0) lons, lats = pm.get_longitudes_and_latitudes_of_the_last_read_rec() projparams = pm.linked_robj_list[0].get_proj_parameters_for_the_last_read_rec() rll = RotatedLatLon(**projparams) bmp = rll.get_basemap_object_for_lons_lats(lons2d=lons, lats2d=lats) xx, yy = bmp(lons, lats) plt.figure() cs = bmp.contourf(xx, yy, tsurf_mean - 273.15, 40) bmp.drawcoastlines() plt.title("Tsurf") plt.colorbar() plt.figure() bmp.contourf(xx, yy, tair_mean, levels=cs.levels, norm=cs.norm, cmap=cs.cmap) bmp.drawcoastlines() plt.title("Tair") plt.colorbar() plt.figure() bmp.contourf(xx, yy, tsurf_mean - 273.15 - tair_mean, levels=np.arange(-2, 2.2, 0.2), cmap=cs.cmap) bmp.drawcoastlines() plt.title("Tsurf - Tair") plt.colorbar() pm.close() dm.close() plt.show()
def plot_lake_fraction_field(): folder = "/home/huziy/skynet3_rech1/geof_lake_infl_exp" fName = "geophys_Quebec_0.1deg_260x260_with_dd_v6" path = os.path.join(folder, fName) rObj = RPN(path) lkf = rObj.get_first_record_for_name_and_level(varname="VF", level=3, level_kind=level_kinds.ARBITRARY) proj_params = rObj.get_proj_parameters_for_the_last_read_rec() lons2d, lats2d = rObj.get_longitudes_and_latitudes_for_the_last_read_rec() lons2d[lons2d >= 180] -= 360 rObj.close() rll = RotatedLatLon(**proj_params) margin = 20 lons2d = lons2d[margin:-margin, margin:-margin] lats2d = lats2d[margin:-margin, margin:-margin] lkf = lkf[margin:-margin, margin:-margin] basemap = rll.get_basemap_object_for_lons_lats(lons2d=lons2d, lats2d=lats2d, resolution="l") x, y = basemap(lons2d, lats2d) fig = plt.figure() gs = GridSpec(1, 2, width_ratios=[1, 1]) ax = fig.add_subplot(gs[0, 0]) df = 0.1 levels = np.arange(0, 1.1, df) cMap = get_cmap("gist_ncar_r", len(levels) - 1) bn = BoundaryNorm(levels, cMap.N) basemap.drawmapboundary(fill_color="0.75") lkf_plot = maskoceans(lons2d, lats2d, lkf, inlands=False) print("Percentage of lakes in the sim domain: {}".format(lkf_plot.mean() * 100)) img = basemap.pcolormesh(x, y, lkf_plot, norm=bn, cmap=cMap) basemap.drawcoastlines() divider = make_axes_locatable(ax) cax = divider.append_axes("bottom", "5%", pad="3%") cb = fig.colorbar(img, cax=cax, ticks=levels, orientation="horizontal") ax = fig.add_subplot(gs[0, 1]) df1 = df levels1 = np.arange(0, 1.1, df1) cell_numms = np.zeros((len(levels1) - 1,)) left = levels[0] right = levels[1] lefts = [] rights = [] lkf_land = lkf[lkf > 0.01] for i in range(len(cell_numms)): cell_numms[i] = ((lkf_land > left) & (lkf_land <= right)).astype(int).sum() lefts.append(left) rights.append(right) left += df1 right += df1 assert isinstance(ax, Axes) ax.bar(lefts, cell_numms, width=df1) # ax.semilogy(rights, cell_numms) ax.xaxis.set_ticks(levels) ax.yaxis.set_ticks(np.arange(1000, 10000, 1000)) sf = ScalarFormatter(useMathText=True) sf.set_powerlimits([-2, 1]) ax.yaxis.set_major_formatter(sf) ax.grid("on") ax.set_xlabel("fraction") ax.set_ylabel("# gridcells") plt.show() fig.tight_layout() fig.savefig("lake_fractions_220x220_0.1deg.jpeg") plt.show() pass
def main(): """ """ # s_lons = [-3.38, 3.40, -12.45, -11.04,-2.92, 0.1,32.55,30.48,23.6,31.27,15.31,23.91,17.51,21.08] # s_lats = [16.26,11.88,14.9,13.91,10.57,6.2,15.61,19.18,-14.02,-21.13,-4.26,4.97,-28.71,-28.69] # assert len(s_lons) == len(s_lats) #path = "data/directions_Africa_Bessam_0.44/infocell_Africa.nc" #path = "/home/huziy/skynet3_exec1/for_offline_routing/directions_africa_dx0.44deg_2.nc" path = "/skynet3_rech1/huziy/for_Arman_routing_data/infocell_na_0.44deg_arman.nc" ds = Dataset(path) dirs = ds.variables["flow_direction_value"][:] acc_area = ds.variables["accumulation_area"][:] lons2d = ds.variables["lon"][:] lats2d = ds.variables["lat"][:] lon_1, lat_1 = -97, 47.5 lon_2, lat_2 = -7, 0 lons2d[lons2d >= 180] -= 360 #min_lon = lons2d[0,0] #max_lon = lons2d[-1,-1] #min_lat = lats2d[0, 0] #max_lat = lats2d[-1,-1] #plot_utils.apply_plot_params(width_pt=None, width_cm=80) #print max_lon fig = plt.figure(dpi=800) #TODO: change projection to rotpole (it will require params) #b = Basemap(projection="rotpole", llcrnrlon=min_lon, # llcrnrlat=min_lat, # urcrnrlon=max_lon, urcrnrlat=max_lat, resolution="i") myproj = RotatedLatLon(lon1=lon_1, lat1=lat_1, lon2=lon_2, lat2=lat_2) print(lons2d.shape) b = myproj.get_basemap_object_for_lons_lats(lons2d[100:150, 70:132], lats2d[100:150, 70:132]) x, y = b(lons2d, lats2d) b.drawcoastlines(linewidth=0.2, color="0.5") # b.pcolormesh(x, y, np.ma.masked_where(dirs <= 0, dirs )) # plt.colorbar() di_list = np.array([1, 1, 0, -1, -1, -1, 0, 1]) dj_list = np.array([0, -1, -1, -1, 0, 1, 1, 1]) delta_indices = np.log2(dirs[dirs > 0]) delta_indices = delta_indices.astype(int) di = di_list[delta_indices] dj = dj_list[delta_indices] acc_area = np.ma.masked_where(acc_area < 0, acc_area) #img = b.pcolormesh(x, y, np.ma.log(acc_area)) ax = plt.gca() #divider = make_axes_locatable(ax) #cax = divider.append_axes("right", "5%", pad="3%") #plt.colorbar(img, cax = cax) i_indices_1d = list(range(dirs.shape[0])) j_indices_1d = list(range(dirs.shape[1])) j_indices_2d, i_indices_2d = np.meshgrid(j_indices_1d, i_indices_1d) i_indices_2d_next = np.zeros_like(i_indices_2d) j_indices_2d_next = np.zeros_like(i_indices_2d) i_indices_2d_next[dirs > 0] = i_indices_2d[dirs > 0] + di j_indices_2d_next[dirs > 0] = j_indices_2d[dirs > 0] + dj for i, j, i_next, j_next in zip(i_indices_2d[dirs > 0], j_indices_2d[dirs > 0], i_indices_2d_next[dirs > 0], j_indices_2d_next[dirs > 0]): # ax.add_line(Line2D([x[i,j], x[i_next, j_next]], [y[i,j], y[i_next, j_next]], linewidth=0.5)) if i == i_next and j == j_next: continue p1 = [x[i, j], y[i, j]] p2 = [x[i_next, j_next], y[i_next, j_next]] dr = [p2[0] - p1[0], p2[1] - p1[1]] ax.add_patch( FancyArrow(p1[0], p1[1], dr[0], dr[1], linewidth=0.5, fc="k", head_width=0.1, length_includes_head=True)) # x1, y1 = b(s_lons, s_lats) # b.scatter(x1, y1, c="r", linewidth=0, zorder = 7, ax = ax) # b.drawrivers(linewidth=0.5, color="#0cf5f8", zorder=8, ax=ax) # b.drawmeridians(np.arange(-10, 90,30)) # b.drawparallels(np.arange(-50, 40, 5), labels=[1,1,1,1], linewidth=0.1) plt.tight_layout() # plt.show() #b.readshapefile("/home/huziy/skynet3_exec1/other_shape/af_major_basins/af_basins", "basin", # linewidth=3, zorder=9, ax=ax #) plt.savefig("with_station_riv_af_dirs_basin_1.0.eps") pass
def main(): # plot_utils.apply_plot_params(20) folder = "/home/huziy/skynet3_rech1/from_guillimin" fname = "geophys_Quebec_0.1deg_260x260_with_dd_v6" path = os.path.join(folder, fname) rObj = RPN(path) mg = rObj.get_first_record_for_name_and_level( "MG", level=0, level_kind=level_kinds.PRESSURE) # j2 = rObj.get_first_record_for_name("J2") levs = [0, 100, 200, 300, 500, 700, 1000, 1500, 2000, 2800] norm = BoundaryNorm(levs, len(levs) - 1) me = rObj.get_first_record_for_name_and_level( "ME", level=0, level_kind=level_kinds.ARBITRARY) proj_params = rObj.get_proj_parameters_for_the_last_read_rec() print(me.shape) lons2d, lats2d = rObj.get_longitudes_and_latitudes_for_the_last_read_rec() lons2d[lons2d > 180] -= 360 # me_to_plot = np.ma.masked_where(mg < 0.4, me) me_to_plot = me # print me_to_plot.min(), me_to_plot.max() rll = RotatedLatLon(**proj_params) basemap = rll.get_basemap_object_for_lons_lats(lons2d=lons2d, lats2d=lats2d) rObj.close() x, y = basemap(lons2d, lats2d) plt.figure() ax = plt.gca() # the_cmap = cm.get_cmap(name = "gist_earth", lut=len(levs) -1) # the_cmap = my_colormaps.get_cmap_from_ncl_spec_file(path="colormap_files/topo_15lev.rgb") the_cmap = my_colormaps.get_cmap_from_ncl_spec_file( path="colormap_files/OceanLakeLandSnow.rgb", ncolors=len(levs) - 1) # new_cm = matplotlib.colors.LinearSegmentedColormap('colormap',new_dict,len(levs) - 1) me_to_plot = maskoceans(lons2d, lats2d, me_to_plot, resolution="l") basemap.contourf(x, y, me_to_plot, cmap=the_cmap, levels=levs, norm=norm) # basemap.fillcontinents(color = "none", lake_color="aqua") basemap.drawmapboundary(fill_color='#479BF9') basemap.drawcoastlines(linewidth=0.5) basemap.drawmeridians(np.arange(-180, 180, 20), labels=[1, 0, 0, 1]) basemap.drawparallels(np.arange(45, 75, 15), labels=[1, 0, 0, 1]) basemap.readshapefile("data/shape/contour_bv_MRCC/Bassins_MRCC_latlon", name="basin", linewidth=1) divider = make_axes_locatable(ax) cax = divider.append_axes("right", "5%", pad="3%") plt.colorbar(ticks=levs, cax=cax) # basemap.scatter(x, y, color="k", s=1, linewidths=0, ax=ax, zorder=2) margin = 20 x1 = x[margin, margin] x2 = x[-margin, margin] y1 = y[margin, margin] y2 = y[margin, -margin] pol_corners = ((x1, y1), (x2, y1), (x2, y2), (x1, y2)) ax.add_patch(Polygon(xy=pol_corners, fc="none", ls="dashed", lw=3)) # plt.tight_layout() # plt.show() plt.savefig("free_domain_260x260.png", dpi=cpp.FIG_SAVE_DPI) pass