带离散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
相关产品推荐
相关产品推荐

