一、imshow() 是什么?
imshow() 函数是 Matplotlib 库中的一个函数,用于显示图像。它常用于绘制二维的灰度图像或彩色图像,也可用于绘制矩阵、热力图、地图等。
核心用途:
| 用途 | 说明 |
|---|---|
| 灰度图像 | 用深浅表示数值大小 |
| 彩色图像 | 显示 RGB 图像 |
| 热力图 | 用颜色映射展示矩阵数值 |
| 地图 | 显示地理图像 |
| 矩阵可视化 | 直观查看二维数据分布 |
二、imshow() 函数语法
python
imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, *, data=None, **kwargs)
核心参数说明:
| 参数 | 说明 |
|---|---|
X |
输入数据,可以是二维数组、三维数组、PIL 图像对象等 |
cmap |
颜色映射,控制不同数值对应的颜色,如 gray、hot、jet |
norm |
数值归一化方式,如 Normalize、LogNorm |
aspect |
图像纵横比,可设为 auto 或数字 |
interpolation |
插值方法,控制平滑程度,如 nearest、bilinear、bicubic |
alpha |
图像透明度,取值范围 0~1 |
origin |
坐标轴原点位置,upper 或 lower |
extent |
显示的数据范围,[xmin, xmax, ymin, ymax] |
vmin, vmax |
颜色映射的值域范围 |
resample |
图像重采样方式 |
url |
图像链接 |
三、显示灰度图像
python
import matplotlib.pyplot as plt import numpy as np # 生成一个二维随机数组 img = np.random.rand(10, 10) # 绘制灰度图像 plt.imshow(img, cmap='gray') # 显示图像 plt.show()
代码解析:
| 代码 | 作用 |
|---|---|
np.random.rand(10, 10) |
生成 10×10 的随机数组,值域 0~1 |
cmap='gray' |
使用灰度颜色映射,0 为黑,1 为白 |
常用灰度 cmap:
| cmap | 效果 |
|---|---|
'gray' |
标准灰度,黑到白 |
'gray_r' |
反向灰度,白到黑 |
'binary' |
二值化,纯黑白 |
四、显示彩色图像
python
import matplotlib.pyplot as plt import numpy as np # 生成一个随机的彩色图像 img = np.random.rand(10, 10, 3) # 绘制彩色图像 plt.imshow(img) # 显示图像 plt.show()
要点:
-
彩色图像是三维数组 ,形状为
(高度, 宽度, 3)。 -
第三个维度表示 RGB 三个通道。
-
不需要设置
cmap参数,因为颜色由数据本身决定。
数组形状对比:
| 形状 | 含义 | cmap |
|---|---|---|
(10, 10) |
灰度图 | 需要 |
(10, 10, 3) |
RGB 彩色图 | 不需要 |
(10, 10, 4) |
RGBA 彩色图(带透明度) | 不需要 |
五、显示热力图
python
import matplotlib.pyplot as plt import numpy as np # 生成一个二维随机数组 data = np.random.rand(10, 10) # 绘制热力图 plt.imshow(data, cmap='hot') # 显示图像 plt.colorbar() plt.show()
关键点:
-
cmap='hot'使用热度颜色映射,黑→红→黄→白。 -
plt.colorbar()添加颜色条,展示数值与颜色的对应关系。
常用热力图 cmap:
| cmap | 效果 |
|---|---|
'hot' |
黑红黄白 |
'coolwarm' |
冷暖对比(蓝到红) |
'viridis' |
感知均匀(默认) |
'plasma' |
紫橙渐变 |
'jet' |
彩虹色(不推荐,感知不均匀) |
'RdBu' |
红蓝对比,适合正负值 |
推荐: 热力图优先使用
viridis、plasma、cividis等感知均匀的颜色映射。
六、显示地图
python
import matplotlib.pyplot as plt import numpy as np from PIL import Image # 加载地图图像 img = Image.open('map.jpg') # 转换为数组 data = np.array(img) # 绘制地图 plt.imshow(data) # 隐藏坐标轴 plt.axis('off') # 显示图像 plt.show()
要点:
-
使用 PIL(Pillow)库加载图像文件。
-
np.array(img)将图像转为 NumPy 数组。 -
plt.axis('off')隐藏坐标轴,让图像更干净。
提示: 需要先安装 Pillow:
pip install Pillow。
隐藏坐标轴的几种方式:
| 写法 | 效果 |
|---|---|
plt.axis('off') |
隐藏坐标轴 |
plt.axis('on') |
显示坐标轴(默认) |
plt.xticks([]) |
只隐藏 x 轴刻度 |
plt.yticks([]) |
只隐藏 y 轴刻度 |
七、显示矩阵
python
import matplotlib.pyplot as plt import numpy as np # 生成一个随机矩阵 data = np.random.rand(10, 10) # 绘制矩阵 plt.imshow(data) # 显示图像 plt.show()
由于矩阵也是二维数组,因此可以使用 imshow() 函数将其显示出来。默认使用 viridis 颜色映射。
八、插值方法(interpolation)
插值方法控制图像的平滑程度和细节程度。
| 插值方法 | 效果 | 适用场景 |
|---|---|---|
'nearest' |
最近邻,无平滑,方块清晰 | 矩阵、离散数据 |
'bilinear' |
双线性,轻度平滑 | 一般图像 |
'bicubic' |
双立方,高度平滑 | 照片、连续数据 |
'antialiased' |
抗锯齿 | 通用 |
'none' |
不插值 | 原始像素 |
三种插值对比实例:
python
import matplotlib.pyplot as plt import numpy as np n = 4 # 创建一个 n x n 的二维 numpy 数组 a = np.reshape(np.linspace(0, 1, n ** 2), (n, n)) plt.figure(figsize=(12, 4.5)) # 第一张图:灰度映射,无颜色混合 plt.subplot(131) plt.imshow(a, cmap='gray', interpolation='nearest') plt.xticks(range(n)) plt.yticks(range(n)) plt.title('Gray color map, no blending', y=1.02, fontsize=12) # 第二张图:viridis 映射,无颜色混合 plt.subplot(132) plt.imshow(a, cmap='viridis', interpolation='nearest') plt.yticks([]) plt.xticks(range(n)) plt.title('Viridis color map, no blending', y=1.02, fontsize=12) # 第三张图:viridis 映射,双立方插值 plt.subplot(133) plt.imshow(a, cmap='viridis', interpolation='bicubic') plt.yticks([]) plt.xticks(range(n)) plt.title('Viridis color map, bicubic blending', y=1.02, fontsize=12) plt.show()
三张图对比:
| 图 | cmap | interpolation | 效果 |
|---|---|---|---|
| 1 | gray |
nearest |
灰度方块,边界清晰 |
| 2 | viridis |
nearest |
彩色方块,边界清晰 |
| 3 | viridis |
bicubic |
彩色渐变,平滑过渡 |
关键区别:
nearest保留原始像素边界,bicubic让颜色平滑过渡。离散数据用nearest,连续数据用bicubic。
九、origin 与 extent 参数
1. origin 参数
| 值 | 效果 |
|---|---|
'upper'(默认) |
原点在左上角,行号向下递增 |
'lower' |
原点在左下角,行号向上递增 |
python
plt.imshow(data, origin='lower') # 原点在左下角
提示: 显示矩阵时,
'upper'符合阅读习惯;显示地理数据时,'lower'符合坐标系习惯。
2. extent 参数
extent 用于控制显示的数据范围,格式为 [xmin, xmax, ymin, ymax]。
python
plt.imshow(data, extent=[0, 100, 0, 50])
用途: 让坐标轴显示真实的物理量,而非像素索引。
十、实战:相关性热力图
python
import numpy as np import matplotlib.pyplot as plt # 中文配置 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 模拟数据:5 个变量的相关系数矩阵 np.random.seed(42) data = np.random.rand(5, 5) corr = np.corrcoef(data) # 计算相关系数 # 绘制热力图 plt.figure(figsize=(8, 6)) im = plt.imshow(corr, cmap='coolwarm', vmin=-1, vmax=1) # 添加颜色条 plt.colorbar(im, label='相关系数') # 设置刻度标签 labels = ['变量A', '变量B', '变量C', '变量D', '变量E'] plt.xticks(range(5), labels) plt.yticks(range(5), labels) # 在每个格子中显示数值 for i in range(5): for j in range(5): plt.text(j, i, f'{corr[i, j]:.2f}', ha='center', va='center', color='white' if abs(corr[i, j]) > 0.5 else 'black') plt.title('变量相关性热力图', fontsize=16) plt.tight_layout() plt.show()
技巧解析:
| 技巧 | 实现 |
|---|---|
| 固定颜色范围 | vmin=-1, vmax=1 让正负值对称 |
| 格子内显示数值 | plt.text() 遍历每个位置 |
| 文字颜色自适应 | 深色背景用白字,浅色背景用黑字 |
| 设置刻度标签 | plt.xticks()、plt.yticks() 配合 range |
十一、imshow() 绘制流程图
十二、常见问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 彩色图显示异常 | 数据形状不对 | 确保三维数组最后一维为 3 或 4 |
| 颜色映射不生效 | 数据是三维数组 | 彩色图不使用 cmap |
| 图像上下颠倒 | origin 设置问题 | 设置 origin='lower' |
| 图像模糊 | interpolation 设置 | 改用 nearest 保留边界 |
| 颜色条不显示 | 未调用 colorbar | 添加 plt.colorbar() |
| PIL 报错 | 未安装 Pillow | pip install Pillow |
| 坐标轴不想要 | 未隐藏 | 添加 plt.axis('off') |
| 颜色范围不合理 | 未设 vmin/vmax | 显式指定值域范围 |
十三、小结
本篇你掌握了 Matplotlib imshow() 的完整用法:
-
灰度图 :二维数组 +
cmap='gray'。 -
彩色图 :三维数组
(H, W, 3),不使用 cmap。 -
热力图 :二维数组 + 感知均匀的 cmap +
colorbar。 -
地图 :PIL 加载图像 +
axis('off')。 -
插值方法 :
nearest保留边界,bicubic平滑过渡。 -
origin 与 extent:控制原点位置与数据范围。
-
实战技巧 :
vmin/vmax固定颜色范围,plt.text()显示数值。
imshow() 是矩阵与图像可视化的核心工具。下一篇我们将学习 Matplotlib 箱线图,用箱体展示数据的统计特征。