如何让Python matplotlib的pcolor图表与底图尺寸自动匹配适配
解决方案
出现错位的核心原因是imshow和pcolor的默认坐标轴范围、y轴方向不一致,通过手动统一两者的绘制范围即可实现完全对齐,以下是可直接运行的实现代码:
import matplotlib.pyplot as plt import numpy as np # 读入图片 im = plt.imread('salad.png') # 获取图片尺寸:im.shape返回(高度, 宽度, 通道数) img_h, img_w = im.shape[:2] # 示例pcolor数据 6行10列,对应将底图划分为6行*10列的热图网格 values = np.random.rand(6, 10) # 创建画布和轴对象 fig,ax = plt.subplots() # 展示底图,指定origin='lower'保证y轴方向和pcolor默认一致 implot = ax.imshow(im, extent=[0, img_w, 0, img_h], origin='lower') # 叠加pcolor,手动指定extent和底图完全一致 p = ax.pcolor(np.linspace(0, img_w, values.shape[1]+1), np.linspace(0, img_h, values.shape[0]+1), values, alpha = 0.5, cmap='viridis') # 添加色标 fig.colorbar(p, ax=ax) plt.show()
关键参数说明
extent:控制绘图元素在坐标轴上的覆盖范围,格式为[x最小值, x最大值, y最小值, y最大值],两者设置为相同值即可保证覆盖范围完全一致origin='lower':修正imshow默认y轴从上到下递增的逻辑,和pcolor的y轴方向匹配,避免热图上下翻转
反向适配方案(底图适配pcolor尺寸)
如果需要固定pcolor的默认坐标范围,只需将imshow的extent设置为pcolor的默认范围即可,示例如下:
fig,ax = plt.subplots() # 底图extent匹配pcolor的默认范围:x到列数,y到行数 implot = ax.imshow(im, extent=[0, values.shape[1], 0, values.shape[0]], origin='lower') p = ax.pcolor(values, alpha = 0.5, cmap='viridis') fig.colorbar(p, ax=ax) plt.show()
内容的提问来源于stack exchange,提问作者sdom
相关产品推荐
相关产品推荐

