Matplotlib网格偏移-0.5及二维数组颜色映射问题技术求助
解决Matplotlib网格偏移-0.5的问题
我明白你遇到的网格偏移问题——这其实是Matplotlib绘制二维数组时默认坐标对齐方式导致的小坑,咱们一步步来搞定它:
问题根源
当你用plt.imshow()绘制二维数组时,默认会把每个像素的中心对齐到数组的索引位置(比如数组的(i,j)元素对应坐标(j+0.5, i+0.5),因为imshow默认origin='upper'),而网格线默认是画在整数坐标上的,这就导致网格看起来偏移了半个单位。
实用解决方案
这里有两种常用的修复方式,你可以根据自己的需求选择:
方法1:调整imshow参数,让网格与像素边缘对齐
通过设置extent参数指定坐标范围,再配合aspect='equal'和adjustable='box',就能让网格线正好落在像素的边缘:
from matplotlib import pyplot as plt from matplotlib import colors import numpy as np # 示例数组 sample = np.zeros((20,20), dtype=int) sample[2,2] = sample[4,4] = 2 # 颜色表与颜色边界 cmap = colors.ListedColormap(['black','white','red','green']) bounds = [-6,0,1,99,105] norm = colors.BoundaryNorm(bounds, cmap.N) fig, ax = plt.subplots() # 设置extent:x从0到20,y从0到20(对应20x20数组的边缘) im = ax.imshow(sample, cmap=cmap, norm=norm, extent=[0, 20, 20, 0], aspect='equal', adjustable='box') # 添加网格 ax.grid(True, color='gray', linestyle='-', linewidth=0.5) # 调整刻度到整数位置 ax.set_xticks(np.arange(0, 21, 1)) ax.set_yticks(np.arange(0, 21, 1)) plt.colorbar(im) plt.show()
方法2:用pcolormesh替代imshow
pcolormesh的默认行为是把像素的边缘对齐到整数坐标,网格线会自然和像素边缘重合,不需要额外调整:
from matplotlib import pyplot as plt from matplotlib import colors import numpy as np # 示例数组 sample = np.zeros((20,20), dtype=int) sample[2,2] = sample[4,4] = 2 # 颜色表与颜色边界 cmap = colors.ListedColormap(['black','white','red','green']) bounds = [-6,0,1,99,105] norm = colors.BoundaryNorm(bounds, cmap.N) fig, ax = plt.subplots() # 创建坐标网格,x和y的范围是0到20(对应20x20数组的边缘) x = np.arange(0, 21, 1) y = np.arange(0, 21, 1) # 使用pcolormesh绘制 im = ax.pcolormesh(x, y, sample, cmap=cmap, norm=norm) # 添加网格 ax.grid(True, color='gray', linestyle='-', linewidth=0.5) # 确保刻度对齐 ax.set_xticks(x) ax.set_yticks(y) plt.colorbar(im) plt.show()
两种方法都能解决网格偏移的问题,如果你习惯用imshow就选第一种,要是更倾向于和坐标系统严格对齐,pcolormesh会更顺手。
内容的提问来源于stack exchange,提问作者Hirad Gorgoroth
相关产品推荐
相关产品推荐

