Matplotlib自定义Colorbar:为不等值区间设置等宽颜色分档
解决Matplotlib自定义Colorbar等宽分档问题
我来帮你搞定这个Colorbar的问题~ 你现在遇到的分档宽度不均的问题,根源就在spacing='proportional'这个参数上,咱们一步步来修正:
问题原因
spacing='proportional'会让Colorbar的每个颜色块宽度和你设定的bounds区间的数值跨度成正比。看你的bounds列表:
bounds= [0.02,0.07,0.28,1.14,4.63,8.60,15.70,28.66,52.39,95.69]
前几个区间的跨度特别小(比如0.02→0.07只有0.05),而最后一个区间52.39→95.69跨度有43.3,这就导致小区间的颜色块被压缩得几乎看不见,完全不符合你的需求。
解决方案
要实现颜色分档宽度相等,同时保持数据对应到你设定的区间,只需要做两个关键调整:
- 把
spacing='proportional'改成spacing='uniform',强制每个颜色块宽度一致 - 简化
ColorbarBase的参数,避免重复传递boundaries和ticks(其实只需要用bounds作为边界,ticks用来显示刻度即可)
修改后的完整代码
import matplotlib as mpl import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=(12, 6)) fig.subplots_adjust(bottom=0.5) # 自定义颜色映射(和你原来的一致) cmap = mpl.colors.ListedColormap([ (1, 1, 1, 0), (237/255, 239/255, 243/255, 1.0), # whitesmoke (172/255, 180/255, 206/255, 1.0), # mediumslateblue (161/255, 215/255, 227/255, 1.0), # lightskyblue (143/255, 200/255, 145/255, 1.0), # seagreen (249/255, 236/255, 51/255, 1.0), # yellow (238/255, 181/255, 9/255, 1.0), # gold (233/255, 135/255, 45/255, 1.0), # orange (223/255, 83/255, 42/255, 1.0), # darkorange (217/255, 38/255, 42/255, 1.0) # red ]) # 你的区间边界(保持不变) bounds = [0.02, 0.07, 0.28, 1.14, 4.63, 8.60, 15.70, 28.66, 52.39, 95.69] ticks = bounds # 刻度和边界一致 # 用BoundaryNorm绑定区间和颜色映射,确保数据正确对应到区间 norm = mpl.colors.BoundaryNorm(bounds, cmap.N) # 创建等宽的Colorbar,关键是spacing='uniform' cb2 = mpl.colorbar.ColorbarBase( ax, cmap=cmap, norm=norm, boundaries=bounds, # 用bounds作为边界 ticks=ticks, # 显示边界作为刻度 spacing='uniform', # 强制每个颜色块宽度相等 orientation='horizontal' ) plt.show()
关键说明
BoundaryNorm依然在工作:它会把你的数据值正确映射到你设定的bounds区间里,每个区间对应一个颜色,这个逻辑完全保留了spacing='uniform'只是改变了Colorbar的视觉显示宽度,让每个颜色块都一样宽,不管区间的数值跨度多大- 现在小区间的颜色块会清晰显示出来,同时数据和区间的映射关系没有改变
内容的提问来源于stack exchange,提问作者Peshawa Luqman
相关产品推荐
相关产品推荐

