import matplotlib
matplotlib.use('TkAgg')
import numpy as np
import rasterio
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
from shapely.geometry import box
plt.rcParams['font.sans-serif'] = ['Arial']
plt.rcParams['axes.unicode_minus'] = False
tif_path = r"E:\GLASS\GLASS_AVHRR_GPP_YEAR\GPP_SEN_TREND.tif"
with rasterio.open(tif_path) as src:
data = src.read(1)
lon_min, lat_min, lon_max, lat_max = src.bounds
transform = src.transform
data = np.flipud(data)
data[data > 50] = np.nan
data[data < -50] = np.nan
print(f"数据范围:最小值={np.nanmin(data)}, 最大值={np.nanmax(data)}")
lon = np.linspace(lon_min, lon_max, data.shape[1])
lat = np.linspace(lat_min, lat_max, data.shape[0])
lon, lat = np.meshgrid(lon, lat)
bounds = box(lon_min, lat_min, lon_max, lat_max)
if not bounds.is_valid:
raise ValueError("Bounding box is invalid.")
def plot_raster():
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111, projection=ccrs.PlateCarree())
ax.set_title('Title', loc='left', fontsize=16)
ax.add_feature(cfeature.COASTLINE.with_scale('110m'), linewidth=0.8)
ax.set_xticks(np.arange(-180, 181, 60), crs=ccrs.PlateCarree())
ax.set_yticks(np.arange(-90, 91, 30), crs=ccrs.PlateCarree())
ax.xaxis.set_major_formatter(LongitudeFormatter())
ax.yaxis.set_major_formatter(LatitudeFormatter())
ax.tick_params(labelsize=10)
try:
levels = [-20, -15, -10, -5, 0, 5, 10, 15, 20]
contour = ax.contourf(lon, lat, data, levels=levels, cmap='RdYlGn', extend='both', transform=ccrs.PlateCarree())
except Exception as e:
print(f"Error in contourf: {e}")
raise
cbar = plt.colorbar(contour, ax=ax, orientation='horizontal', pad=0.07, aspect=55, format='%.0f')
cbar.set_label('Legend', fontsize=18)
cbar.ax.tick_params(labelsize=14)
cbar.set_ticks([-20, -15, -10, -5, 0, 5, 10, 15, 20])
plt.savefig(r'E:\PML_ET_GPP\PML_WUE等\出图\Summer average of t_et.jpg', dpi=300, bbox_inches='tight', pad_inches=0)
plt.show()
plot_raster()