Matplotlib入门教程(十三):imshow() 详解——灰度图、彩色图、热力图与矩阵可视化

一、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 箱线图,用箱体展示数据的统计特征。

相关推荐
小小龙学IT3 小时前
Python Matplotlib 数据可视化库深度解析
python·信息可视化·matplotlib
没有钱的钱仔19 小时前
协方差矩阵含义
算法·机器学习·矩阵
爱刷碗的苏泓舒1 天前
泰勒级数与泰勒展开:GNSS卫地距线性化、Jacobian矩阵与Hessian矩阵
线性代数·算法·矩阵·gnss·雅可比矩阵·卫地距线性化·海森矩阵
烂蜻蜓2 天前
Matplotlib入门教程(十一):饼图详解——pie() 函数与占比可视化
matplotlib
lhh_qrsly2 天前
机器学习 深度学习 强化学习 都学啥 和 高等数学 线性代数 概率论数理统计 有啥关系
深度学习·线性代数·机器学习
烂蜻蜓2 天前
Matplotlib入门教程(十):柱形图详解——bar() 与 barh() 函数完全指南
matplotlib
tigershang2 天前
亲手拆开 Transformer:从手算入门到理论全景
神经网络·ai·矩阵·transformer
yeflx2 天前
行列式、特征值、SVD 等知识点记录(待补充)
线性代数·矩阵
虾..2 天前
三维图形学基础数学(向量,矩阵)
线性代数·矩阵