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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:05:34