如何用Matplotlib叠加不同形状但等比例的图像与NumPy数组?
用matplotlib叠加不同形状的图像与数组并占满绘图宽度
需求说明
需要叠加两类内容:
x:1024x768尺寸的彩色图像(示例为scipy内置浣熊脸),NumPy形状为(768, 1024, 3)y:与x比例接近但形状不同的NumPy数组(示例为(100, 133))
要求两者都占满绘图宽度:图像使用原始1024x768像素,数组通过插值或保持像素化效果后,宽度匹配1024像素。
原代码问题
以下代码运行后仅显示浣熊脸的一小部分:
import numpy as np, matplotlib.pyplot as plt, scipy.misc x = scipy.misc.face(gray=False) # shape (768, 1024, 3) y = np.random.random((100, 133)) # shape (100, 133) fig, (ax0, ax1) = plt.subplots(2, 1, gridspec_kw={'height_ratios': [5, 1]}) img0 = ax0.imshow(x) img1 = ax0.imshow(y, cmap="jet", alpha=0.3) plt.show()
原因是imshow默认会根据数组形状设置坐标轴范围,y的形状(100,133)会将坐标轴限制在0-133(x轴)、0-100(y轴),导致仅显示x的左上角小区域。
解决方案
通过设置extent参数让y的显示范围与x完全匹配,即可实现叠加后两者都占满绘图宽度。同时可通过interpolation参数选择插值方式(平滑拉伸或保持像素化):
import numpy as np import matplotlib.pyplot as plt from scipy.misc import face # 加载图像和随机数组 x = face(gray=False) # 形状 (768, 1024, 3) y = np.random.random((100, 133)) # 形状 (100, 133) fig, ax = plt.subplots() # 显示原始图像 ax.imshow(x) # 叠加数组y:设置extent匹配x的坐标范围,选择插值方式 # interpolation='bilinear' 实现平滑拉伸;interpolation='nearest' 保持像素化 ax.imshow(y, cmap="jet", alpha=0.3, extent=[0, 1024, 0, 768], interpolation='bilinear') plt.show()
补充说明
extent=[0, 1024, 0, 768]指定了y的显示范围:x轴从0到1024,y轴从0到768,完全匹配x的尺寸- 若需要保持
y的像素化风格,将interpolation参数改为'nearest'即可 - 示例中
y的比例(100/133≈0.75)与x的比例(768/1024=0.75)几乎一致,因此拉伸后不会出现明显变形
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

