You need to enable JavaScript to run this app. 带离散colorbar的contourf绘图extend参数不生效问题求助
优惠活动
大模型
产品
解决方案
定价
更多

带离散colorbar的contourf绘图extend参数不生效问题求助

问题原因

你的代码问题出在contourf调用时没有显式传入你定义的等级参数mylevs,同时多余传入了vmin、vmax参数。contourf默认会基于输入数据的极值自动生成绘制等级,这才导致最终色条范围匹配了数据的-4到4范围,而非你期望的-1到1。

修复方案

只需调整contourf的传参即可,修改后的完整可运行代码如下:

# import matplotlib (v 3.1.1)
import matplotlib.colors as colors
import matplotlib.pyplot as plt
import matplotlib.path as mpath
import matplotlib as mpl
# import numpy (v 1.17.2)
import numpy as np

# define grid
lon = np.linspace(start = 0, stop = 359, num = 360)
lat = np.linspace(start = -78, stop = -25, num = 52)
[X,Y] = np.meshgrid(lon, lat)

# generate random gaussian data for example purposes
mean = [0, 0]
cov = [[1, 0], [0, 100]] 
zz = np.random.multivariate_normal(mean, cov, (np.size(lon),np.size(lat))).T
Z = zz[0,:,:]

# illutrate the maximum value of Z
np.max(Z)

# create plot
plt.figure(figsize=(10, 12))

# select plotting levels (missing min/max on purpose)
mylevs = [-1.0, -0.5, 0, 0.5, 1.0]

# colormap
cmap_cividis = plt.cm.get_cmap('cividis',len(mylevs))
mycolors = list(cmap_cividis(np.arange(len(mylevs))))
cmap = colors.ListedColormap(mycolors[:-1], "")
# set over-color to last color of list 
cmap.set_over(mycolors[-1])

# 仅修改此处contourf的传参
C1 = plt.contourf(X, Y, Z, 
                  levels=mylevs, # 新增传入自定义等级
                  cmap=cmap, 
                  norm = colors.BoundaryNorm(mylevs, ncolors=len(mylevs)-1, clip=False),
                  extend='max') # 直接在绘图时指定extend规则

# create colorbar
cbar = plt.colorbar(C1, orientation="horizontal")
cbar.ax.tick_params(labelsize=20)
cbar.set_label('Random field', size='xx-large')
plt.show()

效果说明

修改后运行代码即可得到你预期的结果:

  • 色条范围固定为-1到1,刻度为你定义的[-1.0, -0.5, 0, 0.5, 1.0]
  • 色条右侧显示向右的extend箭头,箭头区域为色表最后一个颜色
  • 所有数值大于1.0的区域都会用该extend对应颜色填充

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 02:06:06