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

创建自定义离散间隔色条报错:'GeoContourSet'无'set'属性

自定义离散色条报错与配色问题解决

问题描述

尝试创建带离散间隔的自定义色条时,执行mpl.colorbar.ColorbarBase(a, ...)报错:AttributeError: 'GeoContourSet' object has no attribute 'set'。改用fig.colorbar(a, ...)虽能生成色条,但仍使用默认RdBu配色,且刻度仅显示到色条1/4处。

原代码

import xarray as xr
from sklearn.linear_model import LinearRegression
import proplot as pplt
import cartopy as ct
import matplotlib as mpl
import matplotlib.pyplot as plt
import colormaps as cmaps
import matplotlib.colors as colors

fig, axs = pplt.subplots(ncols = 2, nrows = 1, axwidth = 7, proj='pcarree')
ax1, ax2 = axs


a = ax1.contourf(era_cape['lon'], era_cape['lat'], regression,  add_colorbar = False, extend = 'both')

axs.format(coast=True, latlim = (20,51), lonlim = (234,293), innerborders = True)
axs.add_feature(ct.feature.OCEAN, zorder=100, edgecolor='k', color = 'white')
axs.add_feature(ct.feature.COASTLINE, zorder=100, edgecolor='k')

cmap1 = mpl.colors.ListedColormap(['purple','navy','slateblue','blue','skyblue','lightblue','aliceblue','yellow','gold','orange','orangered','red','firebrick','darksalmon'])
bounds = [-600, -480, -320, -160, -80, -40, -20, 0, 20, 40, 80, 160, 320, 480, 600]
norm = mpl.colors.BoundaryNorm(bounds, cmap1.N, extend = 'neither')
cb2 = mpl.colorbar.ColorbarBase(a, cmap = cmap1, norm = norm, ticks = bounds, spacing = 'uniform')

解决方案

错误原因

ColorbarBase的第一个参数要求是轴对象(Axes),而非contourf返回的GeoContourSet对象,这是报错的核心原因。此外,原代码未将自定义配色和间隔传给contourf,导致fig.colorbar无法识别自定义设置。

修改后的完整代码

import xarray as xr
from sklearn.linear_model import LinearRegression
import proplot as pplt
import cartopy as ct
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.colors as colors

# 创建画布与子图
fig, axs = pplt.subplots(ncols=2, nrows=1, axwidth=7, proj='pcarree')
ax1, ax2 = axs

# 定义自定义配色与离散间隔
cmap1 = mpl.colors.ListedColormap([
    'purple','navy','slateblue','blue','skyblue','lightblue','aliceblue',
    'yellow','gold','orange','orangered','red','firebrick','darksalmon'
])
bounds = [-600, -480, -320, -160, -80, -40, -20, 0, 20, 40, 80, 160, 320, 480, 600]
# 匹配数据的正负极值,设置extend='both'
norm = mpl.colors.BoundaryNorm(bounds, cmap1.N, extend='both')

# 绘制contourf时直接传入自定义配置
a = ax1.contourf(
    era_cape['lon'], era_cape['lat'], regression,
    levels=bounds,  # 使用自定义间隔作为绘图层级
    cmap=cmap1,
    norm=norm,
    add_colorbar=False,
    extend='both'
)

# 地图样式设置
axs.format(coast=True, latlim=(20,51), lonlim=(234,293), innerborders=True)
axs.add_feature(ct.feature.OCEAN, zorder=100, edgecolor='k', color='white')
axs.add_feature(ct.feature.COASTLINE, zorder=100, edgecolor='k')

# 正确创建匹配的色条
cb2 = fig.colorbar(
    a,
    ax=ax1,  # 指定色条关联的子图
    ticks=bounds,
    spacing='uniform',
    extend='both'
)

关键修改点

  1. 传递自定义配置给contourf:将cmap1、norm和levels=bounds传入contourf,确保绘图时直接使用自定义配色和间隔,避免默认样式覆盖。
  2. 修正色条创建方式:用fig.colorbar并指定ax=ax1,让色条自动关联绘图的配置,无需手动重复设置配色。
  3. 匹配数据范围:将norm的extend改为'both',适配数据的正负极值。

可选:用ColorbarBase单独创建色条

如果需要手动控制色条位置,可单独创建一个轴来放置色条:

# 手动指定色条位置:[左, 下, 宽, 高](基于画布坐标)
cax = fig.add_axes([0.92, 0.15, 0.02, 0.7])
cb2 = mpl.colorbar.ColorbarBase(
    cax,
    cmap=cmap1,
    norm=norm,
    ticks=bounds,
    spacing='uniform',
    extend='both'
)

内容的提问来源于stack exchange,提问作者Megan Franke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:35:36