You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:55:23