解决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
相关产品推荐
相关产品推荐

