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

解决Matplotlib热图中单元格与高亮彩色网格错位的问题

问题原因

你遇到的错位问题是因为imshow和pcolormesh的默认坐标规则不一致:

  • imshow默认将数组索引[0,0]对应到画布的左上角,每个像素单元格的边界为半整数(比如宽度为1的单元格x轴范围是[-0.5, 0.5])
  • pcolormesh默认将数组索引[0,0]对应到画布的左下角,默认网格边界从0开始的整数坐标,和imshow的单元格边界刚好差了0.5个单位,就会出现半格的错位

修复方案

直接替换你添加的高亮代码片段即可,手动指定pcolormesh的边界和imshow完全对齐:

highlight = (h >= 60)
n_rows, n_cols = h.shape
# 手动设置网格边界和imshow对齐
ax.pcolormesh(
    np.arange(-0.5, n_cols), 
    np.arange(-0.5, n_rows), 
    highlight, 
    facecolor='none', 
    edgecolor='red',  # 可自定义高亮边框颜色
    linewidth=1.5
)

可选优化(无错位风险的替代方案)

如果不需要单独的高亮边框,也可以直接自定义热图的颜色映射,把大于等于60的值直接映射为高亮色,天然不会出现错位问题:

from matplotlib.colors import ListedColormap, BoundaryNorm

# 基于原有Blues色阶修改,把≥60的分段替换为半透明红色
base_cmap = plt.cm.get_cmap('Blues', 5)
colors = base_cmap(np.linspace(0, 1, 5))
colors[-2:] = [[1, 0, 0, 0.6], [1, 0, 0, 0.8]] # 替换60-80、80-100分段为红色
custom_cmap = ListedColormap(colors)
norm = BoundaryNorm([0, 20, 40, 60, 80, 100], custom_cmap.N)

# 生成热图时直接使用自定义色阶即可
heatmap = ax.imshow(h, aspect=1, cmap=custom_cmap, norm=norm)

内容的提问来源于stack exchange,提问作者nalfahel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 07:36:03