import numpy as npimport rasterioimport geopandas as gpdimport matplotlib.pyplot as pltfrom rasterio.plot import plotting_extentfrom matplotlib import rcParamsfrom matplotlib.ticker import FuncFormatter, FormatStrFormatterfrom mpl_toolkits.axes_grid1.inset_locator import inset_axestif_path = r"C:\Users\Yu\Downloads\GEE_NDVI_2005_06\vpd.tif"shp_path = r"C:\Users\Yu\Downloads\GEE_NDVI_2005_06\beifang_boundary.shp"out_jpg = r"C:\Users\Yu\Downloads\vpd.jpg"title = "VPD (kPa)"cmap = "RdYlBu_r"font_size = 20vmin = 0vmax = 3cbar_ticks = np.arange(0, 3.1, 0.5)rcParams["font.family"] = "Arial"rcParams["font.size"] = font_sizercParams["axes.unicode_minus"] = Truewith rasterio.open(tif_path) as src: data = src.read(1).astype(float) extent = plotting_extent(src) nodata = src.nodata raster_crs = src.crsif nodata is not None: data[data == nodata] = np.nandata[~np.isfinite(data)] = np.nanboundary = gpd.read_file(shp_path)if boundary.crs != raster_crs: boundary = boundary.to_crs(raster_crs)fig, ax = plt.subplots(figsize=(8, 5), dpi=300)cmap_obj = plt.get_cmap(cmap).copy()cmap_obj.set_bad("white")im = ax.imshow( data, extent=extent, cmap=cmap_obj, vmin=vmin, vmax=vmax, origin="upper")boundary.boundary.plot(ax=ax, color="black", linewidth=1.2)ax.set_title(title, pad=4)ax.set_xlabel("Longitude (°E)")ax.set_ylabel("Latitude (°N)")ax.tick_params(direction="out", right=False, top=False)ax.yaxis.set_ticks_position("left")ax.set_xlim(extent[0], extent[1])ax.set_ylim(extent[2], extent[3])def fmt(x, pos): s = f"{x:.0f}" return s.replace("-", "−")ax.xaxis.set_major_formatter(FuncFormatter(fmt))ax.yaxis.set_major_formatter(FuncFormatter(fmt))for spine in ax.spines.values(): spine.set_linewidth(1.0)cax = inset_axes( ax, width="2.5%", height="100%", loc="lower left", bbox_to_anchor=(1.02, 0, 1, 1), bbox_transform=ax.transAxes, borderpad=0)cbar = plt.colorbar(im, cax=cax, ticks=cbar_ticks)def fmt_cbar(x, pos): s = f"{x:.1f}" return s.replace("-", "−")cbar.ax.yaxis.set_major_formatter(FuncFormatter(fmt_cbar))cbar.ax.tick_params(labelsize=font_size)plt.savefig(out_jpg, dpi=300, format="jpg", bbox_inches="tight", pad_inches=0.01)plt.show()