You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()
问题排查与修复

错误根源

  1. 颜色条刻度与类别不匹配:你给颜色条设置了8个刻度(bounds的8个边界值),但实际只有7个数据类别(1-7),这导致颜色条的标签和实际颜色映射错位,视觉上造成数值7对应错误颜色的假象。
  2. 边界逻辑的视觉误导:虽然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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:58:18