在离散颜色条不起作用的轮廓图中使用“扩展”

时间:2021-05-27 10:11:29

标签: python matplotlib plot contour colorbar

我想创建一个具有强制最大值的轮廓图,并且该值之上的所有内容都用颜色条的最后一种颜色着色。在下面的示例代码中,它在我的设置中重现了我的问题,我希望颜色条的范围在 -1 和 1 之间,并带有一个扩展箭头,指示大于 1.0 的值将用颜色条的最后一种颜色着色。但是,尽管我尝试了各种 stackexchange 讨论中的几种解决方案,但颜色条的范围在 -4 到 4 之间,并且没有扩展箭头。请参阅下面的最小可重现示例。

# 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])

# contour plot: random pattern 
C1 = plt.contourf(X, Y, Z, cmap = cmap, vmin=-1.0, vmax=1.0, 
                  norm = colors.BoundaryNorm(mylevs, ncolors=len(mylevs)-1, clip=False))

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

我希望颜色条停在 1.0,有一个指向右侧的扩展箭头,由颜色条的最后一个颜色遮蔽。在此先感谢您提供的任何帮助。 >

Link to example image produced by the above code

1 个答案:

答案 0 :(得分:0)

这能解决吗?

fig,ax = plt.subplots()

mylevs = [-1.0, -0.5, 0, 0.5, 1.0]

C1 = ax.contourf(X, Y, Z, cmap = cmap, vmin=-1.0, vmax=1.0,levels=mylevs,extend='both')
fig.colorbar(C1)

enter image description here