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
plt.rcParams['font.sans-serif'] = ['Times New Roman']
plt.rcParams['axes.unicode_minus'] = False
tif_path = r"D:\PML_WUE等\出图\空间分布\T_ET_MEAN.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 > 1] = np.nan
data[data <= 0] = 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])
lat_mask = (lat >= -60) & (lat <= 90)
lat = lat[lat_mask]
data = data[lat_mask, :]
lon, lat = np.meshgrid(lon, lat)
lat_mean = np.nanmean(data, axis=1)
def plot_combined():
fig = plt.figure(figsize=(12, 6))
ax_map = fig.add_axes([0.05, 0.1, 0.6, 0.6], projection=ccrs.PlateCarree())
ax_map.set_title('Annual average of T/ET', loc='left', fontsize=16)
ax_map.set_extent([lon_min, lon_max, -60, 90], crs=ccrs.PlateCarree())
ax_map.add_feature(cfeature.COASTLINE.with_scale('110m'), linewidth=0.9)
ax_map.set_xticks(np.arange(-180, 181, 60), crs=ccrs.PlateCarree())
ax_map.set_yticks(np.arange(-60, 91, 30), crs=ccrs.PlateCarree())
ax_map.xaxis.set_major_formatter(LongitudeFormatter())
ax_map.yaxis.set_major_formatter(LatitudeFormatter())
ax_map.tick_params(labelsize=10)
levels = [0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]
contour = ax_map.contourf(lon, lat, data, levels=levels, cmap='RdYlGn', extend='both', transform=ccrs.PlateCarree())
cbar = plt.colorbar(contour, ax=ax_map, orientation='horizontal', pad=0.08, aspect=50, format='%.2f')
cbar.set_label('T/ET', fontsize=18)
cbar.ax.tick_params(labelsize=14)
cbar.set_ticks([0,0.2,0.4,0.6,0.8,1])
ax_profile = fig.add_axes([0.65, 0.237, 0.08, 0.463])
ax_profile.plot(lat_mean, lat, color='black', linewidth=0.8)
ax_profile.set_xlim(0, 1)
ax_profile.set_ylim(-60, 90)
ax_profile.grid(True, linestyle='--', alpha=0.5)
ax_profile.yaxis.set_visible(False)
ax_profile.set_title('')
ax_profile.tick_params(axis='x', labelsize=10)
ax_hist = fig.add_axes([0.08, 0.25, 0.1, 0.25])
flattened_data = data.flatten()
flattened_data = flattened_data[~np.isnan(flattened_data)]
counts, bin_edges = np.histogram(flattened_data, bins=levels)
percentages = counts / counts.sum() * 100
bar_width = (levels[1] - levels[0])
for i in range(len(levels) - 1):
ax_hist.bar(
levels[i] + bar_width / 2, percentages[i], width=bar_width,
color=plt.cm.RdYlGn((levels[i] + levels[i + 1]) / 2 / max(levels)),
edgecolor='black',
align='center'
)
ax_hist.text(
levels[i] + bar_width / 2, percentages[i] + 0.5,
f"{percentages[i]:.1f}%", ha='center', va='bottom', fontsize=8,
rotation=90
)
ax_hist.set_xlim(levels[0], levels[-1])
ax_hist.axis('off')
plt.savefig(
r'D:\PML_WUE等\出图\空间分布\gzh_t_et.jpg',
dpi=300, bbox_inches='tight', pad_inches=0.01
)
plt.show()
plot_combined()