使用 Matplotlib Agg 后端进行图像生成

Beginner

This tutorial is from open-source community. Access the source code

简介

本实验将指导你直接使用 agg 后端在 Python Matplotlib 中创建图像的过程。agg 后端对于那些希望在不使用 pyplot 接口来管理图形、关闭图形等情况下完全控制代码的 Web 应用程序开发人员很有用。在本实验中,我们将向你展示如何将 agg 画布的内容保存到文件以及如何将其提取到 numpy 数组中,该数组又可以传递给 Pillow。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作的验证无法自动化。

如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

创建图形和画布

首先,我们需要创建一个图形(Figure)和一个画布(Canvas)。图形定义了绘图的大小、形状和内容,而画布则是绘制图形的地方。

from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.figure import Figure

fig = Figure(figsize=(5, 4), dpi=100)
canvas = FigureCanvasAgg(fig)

向图形中添加绘图数据

既然我们已经有了一个图形(Figure)和一个画布(Canvas),就可以向绘图中添加一些数据了。在这个例子中,我们将添加一个简单的折线图。

ax = fig.add_subplot()
ax.plot([1, 2, 3])

将图形保存到文件

保存绘图有两种选择。第一种选择是将图形(Figure)保存到文件。在这个例子中,我们将把绘图保存为 PNG 图像。

fig.savefig("test.png")

将渲染器缓冲区提取为 NumPy 数组

保存绘图的第二种选择是将渲染器缓冲区提取为 NumPy 数组。这使我们能够在 CGI 脚本中使用 Matplotlib,而无需将图形写入磁盘。在这个例子中,我们将提取渲染器缓冲区并将其转换为 NumPy 数组。

import numpy as np

canvas.draw()
rgba = np.asarray(canvas.buffer_rgba())

将 NumPy 数组保存为 Pillow 图像

既然我们已经有了 NumPy 数组,就可以将其传递给 Pillow,并以 Pillow 支持的任何格式保存。在这个例子中,我们将把绘图保存为 BMP 图像。

from PIL import Image

im = Image.fromarray(rgba)
im.save("test.bmp")

总结

在这个实验中,我们向你展示了如何在 Python 的 Matplotlib 中使用 agg 后端来创建图像。我们创建了一个图形(Figure)和一个画布(Canvas),向绘图中添加了数据,并将绘图保存为 PNG 图像。我们还将渲染器缓冲区提取为 NumPy 数组,并使用 Pillow 将绘图保存为 BMP 图像。对于那些希望在不使用 pyplot 接口来管理图形、关闭图形等情况下完全控制代码的 Web 应用程序开发者来说,这些技术很有用。