Matplotlib中将绘图保存到Numpy数组的2种方法

在 Python 中将绘图保存到 NumPy 数组是一种将数据可视化与数组操作联系起来的技术,允许将图形绘图直接存储为数组表示形式,从而促进在 Python 环境中进行进一步的计算分析或修改。让我们学习如何使用 Matplotlib 将绘图保存到 NumPy 数组

如何将绘图保存到 NumPy 数组
要将绘图保存到 NumPy 数组,必须首先使用 Matplotlib 等绘图库创建绘图,然后利用“canvas.tostring_rgb()”方法将绘图捕获为 RGB 字符串,并将该数据重新整形为 NumPy 数组:适当的尺寸。

基本步骤包括:

  • 绘制并捕获绘图的 RGB 表示
  • 将其重塑为数组,确保可视化无缝集成到数据分析工作流程中。

方法1:使用fig.canvas.tostring_rgb和numpy.fromstring

  • 在这种方法中,绘图被创建并绘制在画布上。绘制画布以渲染绘图,然后使用“ buf= Fig.canvas.tostring_rgb() ”将渲染的画布转换为原始 RGB 缓冲区。
  • 原始缓冲区被转换为表示图像的 NumPy 数组。最后,它打印图像数组的形状和一部分像素值及其 RGB 值。

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])
fig.canvas.draw()

将画布canvas 转换为原始 RGB 缓冲区
buf = fig.canvas.tostring_rgb()
ncols, nrows = fig.canvas.get_width_height()
image = np.frombuffer(buf, dtype=np.uint8).reshape(nrows, ncols, 3)

print("Image shape:", image.shape)
print(
"First 3x3 pixels and RGB values:")
print(image[:3, :3, :])

输出:
Image shape: (480, 640, 3)
First 3x3 pixels and RGB values:
[[[255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]]]

图像的尺寸为(480,640,3),这些数字表示:

  • 480: 这是图像的高度(以像素为单位)。
  • 640: 这是图像的宽度(以像素为单位)。
  • 3: 这表示图像中颜色通道的数量。由于该值为 3,因此它可能是 RGB 图像,其中每个像素具有代表红色、绿色和蓝色强度的三个值。

方法 2:将绘图保存到 io.BytesIO 对象中

  • 这种方法是用 Matplotlib 创建一个绘图,然后将其保存到内存中的 BytesIO 对象(作为 PNG),即内存中的临时缓冲区,而不是直接保存到文件中。
  • 然后使用 Pillow(PIL Fork)库将 BytesIO 对象读入 PIL 图像,并将其转换为 NumPy 数组。这种方法可以高效地将绘图转换为数组,而无需从磁盘保存和读取。

import matplotlib.pyplot as plt
import numpy as np
import io
from PIL import Image

fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])

# Create a bytes buffer to save the plot
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)

# 从缓冲区打开 PNG 图像,并将其转换为 NumPy 数组
image = np.array(Image.open(buf))
# Close the buffer
buf.close()

print("Image shape:", image.shape)
print(
"First 3x3 pixels and RGB values:")
print(image[:3, :3, :])

输出:
Image shape: (480, 640, 4)
First 3x3 pixels and RGB values:
[[[255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]]

 [[255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]]

 [[255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]]]

输出 (480, 640, 4) 给出了一个 NumPy 数组,表示高度为 480 像素、宽度为 640 像素和四个颜色通道(RGBA)的图像。虽然绘图数据本身可能没有明确使用 alpha 通道,但它的存在可能是 Matplotlib 处理 PNG 透明度或所用图像处理库行为的结果。

  • 具有 PNG 透明度的 Matplotlib:使用 plt.savefig 将 Matplotlib 图形保存为 PNG 格式并启用透明度时,即使图形本身没有明确使用透明度,生成的图像也可能有 Alpha 通道。这种行为取决于 Matplotlib 对 PNG 图像的内部处理。
  • 外部库 (PIL):在使用 PIL 等外部库打开图像时,即使 Matplotlib 中的原始 PNG 没有添加阿尔法通道,也可能会添加。某些图像处理库(如 PIL)可能会默认设置或添加阿尔法通道,以保持一致性。

结论
总之,在 Python 中将绘图转换为 NumPy 数组,通过将其与基于数组的计算集成,增强了数据可视化,为各种应用提供了灵活性。