首页编程开发Matplotlib【数据可视化(Matplo...

【数据可视化(Matplotlib篇)】48.绘制数据图像imshow()

本系列文章配套代码获取有以下两种途径:

  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1jG-rGG4QMuZu0t0kEEl7SA?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Data_Visualization





绘制数据图像就是将数据以图像形式显示,即在一个二维规则栅格上呈现。输入可以是真正的 RGB(A) 图像数组,也可以是二维标量数据,后者会被渲染成伪彩色图像。
01

函数语法


Matplotlib imshow()函数专门用于绘制数据图像,其函数语法如下:
plt.imshow(X, cmap=None, norm=None, *, aspect=None           interpolation=None, alpha=None, vmin=None           vmax=None, colorizer=None, origin=None           extent=None, interpolation_stage=None           filternorm=True, filterrad=4.0, resample=None           url=None, data=None, **kwargs)
其中:
  • X要显示的图像数据。可以是,(M, N)(标量数据)、(M, N, 3)RGB)、(M, N, 4)RGBA,含透明度)。

  • cmap颜色映射,用于将标量数据映射到颜色。默认是‘viridis’

  • norm用于将数据值映射到颜色映射区间的归一化方法。常用选项包括,Normalize, LogNorm, PowerNorm等。

  • aspect轴的纵横比,控制数据像素是否为正方形。可用选项包括, ‘equal’(确保宽高比与图像相同)、‘auto’填充整个轴区域、数值指定特定的宽高比)。

  • interpolation插值方法,控制像素的显示方式可用选项包括,‘none’不插值‘nearest’最近邻插值‘bilinear’双线性插值‘bicubic’双三次插值‘spline16’/’spline36’样条插值‘hanning’/’hamming’平滑插值‘lanczos’Lanczos插值)等。

  • alpha透明度,范围0(透明)到1(不透明)。

  • vmin、vmax定义颜色映射的数据范围。数据超出此范围的值将被裁剪。

  • origin控制数组原点位置。可用选项包括,‘upper’原点在左上角,默认)、‘lower’原点在左下角)。

  • extent定义图像在数据坐标中的边界(left,right,bottom,top)。默认为(-0.5, numcols-0.5, -0.5, numrows-0.5)

  • interpolation_stage插值阶段,控制何时应用插值。可用选项包括,‘data’在数据映射到颜色之前插值,默认)、‘rgba’在数据映射到颜色之后插值)。

  • filternorm是否对插值滤波器进行归一化(默认True)。

  • filterrad滤波器半径(以像素为单位),用于‘interpolation’=’sinc’

  • resample是否重采样,仅在缩放时有效(默认None)。

  • url为图像添加 URL 链接(仅在某些后端支持)

  • data如果给定,所有参数也可以作为字符串,用于从data中查找。

通过调整这些参数,可以灵活控制数据图像的视觉效果。

# 创建一个10x10的随机数组
np.random.seed(42)
data = np.random.rand(10, 8)

# 使用imshow显示
plt.imshow(
            data,            # 要显示的二维数据数组
            cmap='viridis',  # 颜色映射方案
            aspect='auto',   # 图像宽高比模式
            vmin=0.2,        # 颜色映射的最小值
            vmax=0.8         # 颜色映射的最大值
          )

# 添加颜色条
plt.colorbar()  
plt.title("基本imshow示例")
plt.show()

可视化结果如下图所示:


02

使用示例


  • 示例 1:显示图像

imshow() 函数既能可视化二维数据矩阵(如热力图、数值矩阵),也能直接显示图像文件(如 PNGJPG 等格式的图片)。这两种用法的核心逻辑一致,即将数组中的数值映射为像素颜色,但处理对象的细节有所不同。

当输入是纯数值矩阵(如 (M, N) 形状的二维数组)时,imshow() 会根据颜色映射表(cmap)将每个数值转换为对应颜色,常用于展示数据分布规律。

当输入是图像文件转换的数组时,通常是 (高度, 宽度, 3) 或 (高度, 宽度, 4) 形状,分别对应 RGB 或 RGBA 格式,imshow() 会直接解析数组中的颜色通道值(0-255),还原图像原本的色彩。

from PIL import Image
import matplotlib.image as img

# 加载图像的两种常用方法

# 方法一:
# image = Image.open('example.jpg')
# image = np.array(image)

# 方法二:
image = img.imread('example.jpg')

plt.imshow(image)
plt.axis('off')  # 隐藏坐标轴
plt.show()

可视化结果如下图所示:


  • 示例 2:添加数值标注+坐标轴优化

可以通过诸如添加数值标注和优化坐标轴等手段提升图表可视化效果。

# 创建数据
np.random.seed(42)
temperatures = np.random.uniform(20, 30, size=(3, 5))
times = ['8:00','9:00','10:00','11:00','12:00']
positions = ['位置A','位置B','位置C']

fig, ax = plt.subplots(figsize=(8, 4))
im = ax.imshow(temperatures, cmap='coolwarm', aspect='auto')
fig.colorbar(im, ax=ax, label='温度 (℃)')

# 自定义刻度位置和标签
ax.set_xticks(np.arange(len(times)))
# 将x轴刻度标签替换为实际时间名称
ax.set_xticklabels(times)
ax.set_yticks(np.arange(len(positions)))
# 将y轴刻度标签替换为实际位置名称
ax.set_yticklabels(positions)
# 调整x轴标签显示方式:旋转45度,右对齐
plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor")
ax.set_title('带数值标注的温度热力图', fontsize=12, pad=15)

# 在每个单元格中心添加数值标注
for i in range(len(positions)): 
    for j in range(len(times)):
        text = ax.text(j, i, f'{temperatures[i, j]:.1f}',
                       ha="center", va="center", color="black", fontsize=9)

# 添加网格线(通过刻度)
# 设置次要刻度位置:在主要刻度之间(-0.5位置),用于定位网格线
ax.set_xticks(np.arange(5)-0.5, minor=True)
ax.set_yticks(np.arange(3)-0.5, minor=True)
# 绘制次要刻度处的网格线
ax.grid(which="minor", color="w", linestyle='-', linewidth=2)
# 隐藏次要刻度的刻度线(只保留网格线)
ax.tick_params(which="minor", size=0)

plt.tight_layout()
plt.show()

可视化结果如下图所示:


  • 示例 3:根据返回的对象进一步调整图像属性
imshow()函数将返回matplotlib.image.AxesImage对象,通过该对象可用于进一步调整图像属性。常用属性调整:
  • set_cmap():动态切换颜色映射方案;
  • set_clim():调整数据映射到颜色的范围(替代初始的 vmin/vmax 参数);
  • set_alpha():修改图像透明度(0 完全透明,1 完全不透明);
  • set_interpolation():更改插值方式;
  • set_data()动态更新显示的数据。

# 创建10x10的随机数组
np.random.seed(42)
data = np.random.rand(10, 10)

# 创建2个子图(1行2列)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# --------------------------
# 绘制原图(第一个子图)
# --------------------------
im1 = ax1.imshow(data, cmap='viridis', interpolation='bicubic')
cbar1 = fig.colorbar(im1, ax=ax1)
cbar1.set_label('数值强度', fontsize=10)
ax1.set_title('原图', fontsize=12, pad=10)
ax1.set_xlabel('X轴', fontsize=10)
ax1.set_ylabel('Y轴', fontsize=10)

# --------------------------
# 绘制修改后的图(第二个子图)
# --------------------------
im2 = ax2.imshow(data, cmap='viridis', interpolation='bicubic')

# 1. 调整颜色映射和归一化参数
im2.set_cmap('plasma')  # 从viridis改为plasma
im2.set_clim(vmin=-0.5, vmax=0.5)  # 调整数值映射范围

# 2. 调整透明度
im2.set_alpha(0.8)  # 设置80%透明度

# 3. 调整插值方式
im2.set_interpolation('none'

# 4. 动态更新显示的数据
new_data = np.random.rand(5, 5)
im2.set_data(new_data)  # 更新为5x5的新数据

# 添加颜色条
cbar2 = fig.colorbar(im2, ax=ax2)
cbar2.set_label('数值强度', fontsize=10)

# 设置标题和坐标轴
ax2.set_title('修改后的图', fontsize=12, pad=10)
ax2.set_xlabel('X轴', fontsize=10)
ax2.set_ylabel('Y轴', fontsize=10)

# 打印数据形状信息
print("原图数据形状:", im1.get_array().shape)
print("修改后的数据形状:", im2.get_array().shape)

plt.tight_layout()
plt.show()
可视化结果如下图所示:


更多内容可以前往官网查看

https://matplotlib.org/stable/


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments