Matplotlib绘图嵌套轴异常与发散色标负值饱和问题求助
问题分析与解决方案
一、嵌套坐标轴与Colorbar截断问题
问题原因
代码中先通过fig, ax = plt.subplots()创建了默认坐标轴,随后又调用ax = plt.axes(projection=ccrs.PlateCarree())重新创建带投影的坐标轴,导致原默认坐标轴未被清除,形成嵌套显示。多余的0-1范围坐标轴正是最初创建的默认axes,会挤压cartopy坐标轴的空间,最终导致colorbar被截断。
解决方式(两种可选)
方式1:在plt.subplots中直接指定投影
无需额外调用plt.axes,一次性创建带投影的坐标轴:
fig, ax = plt.subplots(1,1,figsize=(15,10), subplot_kw={'projection': ccrs.PlateCarree()}) # 后续直接使用ax进行绘图设置 ax.set_extent([-118.96,-117.54,32.9,34.05])
方式2:先创建Figure,再添加带投影的子图
通过add_subplot直接指定投影参数:
fig = plt.figure(figsize=(15,10)) ax = fig.add_subplot(111, projection=ccrs.PlateCarree()) ax.set_extent([-118.96,-117.54,32.9,34.05])
二、发散色条负值错误饱和问题
问题原因
代码中先通过TwoSlopeNorm定义了发散色条的范围(vmin=-20, vcenter=0, vmax=20),但随后调用im.set_clim(0.1,1.5)强制将颜色范围修改为0.1到1.5,所有负值都低于0.1阈值,因此被映射为色条的最低端,出现错误饱和。
解决方式
删除im.set_clim(0.1,1.5)这一行,保留TwoSlopeNorm的设置。如果需要根据实际数据调整色条范围,可以动态使用异常值的极值:
vmin = anomaly.min() vmax = anomaly.max() im = ax.scatter(lon_now_clean1, lat_now_clean1, norm=colors.TwoSlopeNorm(vmin=vmin, vcenter=0, vmax=vmax), c=anomaly, cmap='PiYG')
修正后的核心代码片段
# 数据处理部分保持不变 for i in range (0,31,1): day = i+1 chl_now = chl_july_mean[:,i] remove_nan = ~np.isnan(chl_now) chl_now_clean1 = chl_now[remove_nan] lon_now_clean1 = lon_july_mean[remove_nan] lat_now_clean1 = lat_july_mean[remove_nan] mean_chl_clean = mean_chl[remove_nan] if np.size(chl_now_clean1)==0: continue anomaly = chl_now_clean1 - mean_chl_clean print('min', anomaly.min()) print('max', anomaly.max()) # 正确创建带投影的坐标轴 fig, ax = plt.subplots(1,1,figsize=(15,10), subplot_kw={'projection': ccrs.PlateCarree()}) ax.set_extent([-118.96,-117.54,32.9,34.05]) # 基于实际数据设置发散色条 vmin = anomaly.min() vmax = anomaly.max() im = ax.scatter(lon_now_clean1, lat_now_clean1, norm=colors.TwoSlopeNorm(vmin=vmin, vcenter=0, vmax=vmax), c=anomaly, cmap='PiYG') ax.add_feature(cfeature.LAND,zorder=4,color='gray') ax.set_title("Chlorophyll Anomaly 2016 July "+str(day),fontsize=25) ax.set_xlabel("Longitude",fontsize=20) ax.set_ylabel("Latitude",fontsize=20) xticks = np.linspace(-118.96,-117.54,5) yticks = np.linspace(32.9,34.05,5) ax.set_xticks(ticks=xticks) ax.set_yticks(ticks=yticks) fig.colorbar(im, ax=ax) ax.coastlines() plt.savefig('frankieleelopez/0124anomaly72016'+str(day)) plt.close()
内容的提问来源于stack exchange,提问作者FRANKIE LOPEZ
相关产品推荐
相关产品推荐

