如何创建带文本标签的自定义独立matplotlib colorbar并解决标签错位问题
问题原因
默认ListedColormap的数值映射范围是[0,1],你设置的0-7刻度超出了默认范围,导致标签和色块无法对齐。要实现一一绑定,需要显式定义数值边界,让每个色块对应固定的数值区间,再把标签放在色块中心位置。
正确实现代码
import matplotlib.colorbar as colorbar import matplotlib.colors as clr import matplotlib.pyplot as plt cb_colors = ["#000000", "#808000", "#D3D3D3", "#FFFFFF", "#000080", "#FF4500", "#696969", "#FFFFE0"] cb_labels = ["A", "B", "C", "D", "E", "F", "G", "H"] cmap_ = clr.ListedColormap(cb_colors) # 1. 定义颜色边界:8个颜色对应9个边界,每个颜色对应一个1单位宽度的区间 bounds = list(range(len(cb_colors)+1)) # 2. 用BoundaryNorm将数值区间和颜色一一映射 norm = clr.BoundaryNorm(bounds, cmap_.N) fig = plt.figure() ax = fig.add_axes([0.05, 0.80, 0.9, 0.1]) # 3. 创建colorbar时传入自定义norm cb = colorbar.ColorbarBase(ax, orientation='horizontal', cmap=cmap_, norm=norm) # 4. 刻度设置在每个色块的中心位置 cb.set_ticks([x + 0.5 for x in range(len(cb_colors))]) cb.set_ticklabels(cb_labels) plt.show()
修改点说明
- 新增
BoundaryNorm规则:将每个颜色绑定到长度为1的连续区间,避免默认0-1范围和自定义刻度不匹配的问题 - 刻度设置在每个颜色区间的中心位置,保证标签正好落在对应色块的正下方
内容的提问来源于stack exchange,提问作者Ugurcan
相关产品推荐
相关产品推荐

