Matplotlib离散自定义Colorbar热力图颜色映射异常问题排查
问题描述
我正在制作一款数据为1-7(含)整数的Matplotlib热力图,期望为每个数值指定自定义颜色,并配套显示带标签的离散颜色条。但出现颜色映射异常:数值7未对应颜色列表最后一位的grey,反而对应第三位的white。相关代码如下:
def plot(data): fig, ax = plt.subplots(figsize=(16, 4), dpi = 300) colours = ["cyan", "red", "white", "lime", "yellow", "k", 'grey'] bounds = np.array([1, 2, 3, 4, 5, 6, 7, 8]) -0.5 #0.5 to center it which does not work cmap = colors.ListedColormap(colours) norm = colors.BoundaryNorm(bounds, cmap.N) h = ax.pcolor(data, norm= norm, cmap = cmap) cbar = plt.colorbar(h) cbar.set_ticks(ticks = bounds, labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']) plt.title("Assessment of Different Turbulent Mixing Sources", fontsize = 20) plt.xlabel("Time EDT (hh:mm)", fontsize = 20) plt.ylabel("Height (m)", fontsize=20) plt.show()
问题排查与修复
错误根源
- 颜色条刻度与类别不匹配:你给颜色条设置了8个刻度(
bounds的8个边界值),但实际只有7个数据类别(1-7),这导致颜色条的标签和实际颜色映射错位,视觉上造成数值7对应错误颜色的假象。 - 边界逻辑的视觉误导:虽然
bounds的计算逻辑正确(每个数值的上下边界),但颜色条刻度指向边界而非类别中心,进一步加剧了映射关系的混乱。
修复后的代码
import matplotlib.pyplot as plt from matplotlib import colors import numpy as np def plot(data): fig, ax = plt.subplots(figsize=(16, 4), dpi=300) colours = ["cyan", "red", "white", "lime", "yellow", "k", 'grey'] # 定义每个数值对应的上下边界,8个边界划分7个区间 bounds = [0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5] cmap = colors.ListedColormap(colours) norm = colors.BoundaryNorm(bounds, cmap.N) # 用imshow更适配离散热力图(若偏好pcolor可保留原写法) h = ax.imshow(data, norm=norm, cmap=cmap, aspect='auto') # 颜色条刻度设置为类别中心(1-7),标签数量与类别一致 cbar = plt.colorbar(h) cbar.set_ticks(ticks=np.arange(1, 8), labels=['a', 'b', 'c', 'd', 'e', 'f', 'g']) plt.title("Assessment of Different Turbulent Mixing Sources", fontsize=20) plt.xlabel("Time EDT (hh:mm)", fontsize=20) plt.ylabel("Height (m)", fontsize=20) plt.show()
关键修改说明
- 颜色条刻度修正:将
ticks改为np.arange(1,8),即每个数据类别的中心值,同时把标签数量从8个缩减为7个,确保颜色、数值、标签完全一一对应。 - 可选优化:替换
pcolor为imshow,离散热力图的显示逻辑更直观,避免pcolor可能存在的坐标轴索引对齐问题(若需保留pcolor,仅需修改颜色条部分即可)。 - 边界定义简化:直接写出边界数值,让逻辑更清晰,避免原代码中计算式的潜在误解。
内容的提问来源于stack exchange,提问作者Félix Bélair
相关产品推荐
相关产品推荐

