创建自定义离散间隔色条报错:'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' )
关键修改点
- 传递自定义配置给contourf:将
cmap1、norm和levels=bounds传入contourf,确保绘图时直接使用自定义配色和间隔,避免默认样式覆盖。 - 修正色条创建方式:用
fig.colorbar并指定ax=ax1,让色条自动关联绘图的配置,无需手动重复设置配色。 - 匹配数据范围:将
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
相关产品推荐
相关产品推荐

