使用 Python 进行矢量图形光栅化

PythonPythonBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习矢量图形的光栅化。光栅化是将矢量图形转换为光栅图像(像素)的过程。它可以加快渲染速度,并为大型数据集生成更小的文件,但代价是分辨率固定。我们将使用 Python Matplotlib 库来说明光栅化的概念。

虚拟机使用提示

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

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

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

导入库

在开始之前,我们需要导入所需的库。

import matplotlib.pyplot as plt
import numpy as np

创建数据

我们将创建一些数据,用于说明光栅化概念。

d = np.arange(100).reshape(10, 10)  ## 要进行颜色映射的值
x, y = np.meshgrid(np.arange(11), np.arange(11))

theta = 0.25*np.pi
xx = x*np.cos(theta) - y*np.sin(theta)  ## 将 x 旋转 -theta
yy = x*np.sin(theta) + y*np.cos(theta)  ## 将 y 旋转 -theta

创建一个包含四个子图的图形

我们将创建一个包含四个子图的图形,以说明光栅化的不同方面。

fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, layout="constrained")

创建一个没有光栅化的伪彩色图

我们将创建一个没有光栅化的伪彩色图,以说明光栅化和非光栅化之间的区别。

ax1.set_aspect(1)
ax1.pcolormesh(xx, yy, d)
ax1.set_title("No Rasterization")

创建一个带有光栅化的伪彩色图

我们将创建一个带有光栅化的伪彩色图,以说明光栅化如何加快渲染速度并生成更小的文件。

ax2.set_aspect(1)
ax2.set_title("Rasterization")
ax2.pcolormesh(xx, yy, d, rasterized=True)

创建一个带有叠加文本且无光栅化的伪彩色图

我们将创建一个带有叠加文本且无光栅化的伪彩色图,以说明对于某些艺术家(如坐标轴和文本)而言,矢量图形如何能保持矢量图形的优势。

ax3.set_aspect(1)
ax3.pcolormesh(xx, yy, d)
ax3.text(0.5, 0.5, "Text", alpha=0.2,
         va="center", ha="center", size=50, transform=ax3.transAxes)
ax3.set_title("No Rasterization")

创建一个带有叠加文本且有光栅化的伪彩色图

我们将创建一个带有叠加文本且有光栅化的伪彩色图,以说明光栅化如何使矢量图形能够为某些艺术家(如坐标轴和文本)保持矢量图形的优势。

ax4.set_aspect(1)
m = ax4.pcolormesh(xx, yy, d, zorder=-10)
ax4.text(0.5, 0.5, "Text", alpha=0.2,
         va="center", ha="center", size=50, transform=ax4.transAxes)
ax4.set_rasterization_zorder(0)
ax4.set_title("Rasterization z$<-10$")

保存图形

我们将以 pdf 和 eps 格式保存图形。

plt.savefig("test_rasterization.pdf", dpi=150)
plt.savefig("test_rasterization.eps", dpi=150)

if not plt.rcParams["text.usetex"]:
    plt.savefig("test_rasterization.svg", dpi=150)
    ## svg 后端当前忽略 dpi

总结

在本实验中,我们学习了矢量图形的光栅化。我们使用 Python 的 Matplotlib 库来说明光栅化的概念。我们创建了一个包含四个子图的图形,以说明光栅化的不同方面。我们还了解到光栅化如何加快渲染速度,并为大型数据集生成更小的文件,但代价是固定分辨率。我们还了解到光栅化如何使矢量图形能够为某些艺术家(如坐标轴和文本)保持矢量图形的优势。