matplotlib中contour绘图搭配colorbar时范围不准、色彩丢失问题求助
问题原因
你遇到的问题根源是contour和imshow两个绘图元素使用的色彩映射范围不一致,且plt.colorbar()默认绑定最后一个生成的可映射对象(也就是imshow):
- 第一次不加参数调用
plt.colorbar()时,绑定的是imshow,使用Z的全部取值范围,所以colorbar范围和等高线刻度不匹配 - 改成
plt.colorbar(CS)时,colorbar绑定了等高线的范围,但imshow仍使用Z的全范围做色阶映射,和等高线的色彩对应不上,看起来就像丢失了色彩
解决方案
统一两个绘图元素的色彩映射范围即可,修改后的代码如下:
x = np.linspace(4, 11) y = np.linspace(6, 11) X, Y = np.meshgrid(x, y) XX = np.array([X.ravel(), Y.ravel()]).T Z = -bgmm.score_samples(XX) Z = Z.reshape(X.shape) plt.style.use('seaborn-white') # 提前定义等高线层级,提取映射范围上下限 levels = np.logspace(0, 1, 5) vmin, vmax = levels.min(), levels.max() CS = plt.contour(X, Y, Z, levels=levels, cmap='RdGy', vmin=vmin, vmax=vmax) plt.clabel(CS, inline=True, fontsize=8) # imshow指定和等高线一致的映射范围,保证色彩规则对齐 plt.imshow(Z, extent=[4, 11, 6, 11], origin='lower', cmap='RdGy', alpha=0.5, vmin=vmin, vmax=vmax) # 显式绑定等高线对象,保证colorbar刻度匹配 CB = plt.colorbar(CS) plt.scatter(X_train[:, 0], X_train[:, 1], s=0.8) plt.show()
效果说明
调整后contour和imshow使用完全一致的色彩映射区间,超出范围的数值会被自动截断到边界色,既可以保证colorbar范围和等高线层级匹配,也不会出现色彩丢失的问题。
内容的提问来源于stack exchange,提问作者user1393214
相关产品推荐
相关产品推荐

