Matplotlib - PostScript
PostScript 是一种页面描述语言,也是一种动态类型、基于栈的编程语言,常简称为 PS。它由 Adobe Systems 在 20 世纪 80 年代初创建,主要用于描述打印页面的布局和图形。它广泛应用于电子出版和桌面出版应用中。
PostScript 文件可以在不同设备上打印或显示,而不会丢失质量。这是生成不同用途图表的關鍵优势。
Matplotlib 中的 PostScript
在 Matplotlib 的上下文中,PostScript 作为 backend rendering engine(用于在屏幕上显示图形或写入文件),使用户能够生成出版质量的图表和图形。当选择 PostScript backend 时,Matplotlib 会生成 PostScript 代码来描述图表的布局和外观。
Matplotlib 生成的 PostScript 代码包含绘制线条、形状、文本和其他图形元素的指令。这些指令使用 PostScript 编程语言编写。
Matplotlib 的 PostScript Backend(matplotlib.backends.backend_ps)可以生成 .ps 和 .eps 文件。
创建 PostScript 文件
让我们探讨如何使用 Matplotlib 创建一个简单的图表并将其保存为 PostScript 文件。
示例 - 创建简单图表
此示例演示如何创建带有自动换行的文本的简单图表,并将其保存为 PostScript 文件(.ps)。
import matplotlib
import matplotlib.pyplot as plt
import textwrap
from pylab import *
# 生成包含可打印字符(ASCII 32 到 126)的字符串
text_to_wrap = "".join(c for c in map(chr, range(32, 127)) if c.isprintable())
# 将字符串换行以适应图形
wrapped_text = "\n".join(textwrap.wrap(text_to_wrap))
# 将换行文本添加到图形中
figtext(0, 0.5, wrapped_text)
# 将图形保存为名为 "test.ps" 的 PostScript 文件
savefig("test.ps")
print('Successfully created the PostScript (PS) file...')
输出
如果访问保存输出的文件夹,您将看到生成的 PostScript 文件名为 test.ps。
Successfully created the PostScript (PS) file...
示例 - 使用 PostScript Backend
以下是另一个示例,演示如何使用 PostScript backend 生成图表并保存为封装 PostScript(EPS)文件。
import numpy as np
from matplotlib import pyplot as plt
# 生成数据
x_data = np.linspace(1, 10, 100)
y_data = np.sin(x_data)
# 创建图表
plt.plot(x_data, y_data, c='green', marker='o')
plt.grid()
# 将图形保存为名为 "example.eps" 的 PostScript 文件
plt.savefig("example.eps")
print('Successfully created the encapsulated PostScript (EPS) file...')
输出
如果访问保存输出的文件夹,您将看到生成的 PostScript 文件名为 example.eps。
Successfully created the encapsulated PostScript (EPS) file...
自定义 PostScript 输出
在 Matplotlib 中调整 PostScript 输出设置可以提升 Encapsulated PostScript (EPS) 文件的视觉质量。默认情况下,Matplotlib 在创建 EPS 文件时使用蒸馏过程。此蒸馏步骤会移除 LaTeX 认为在 EPS 文件中非法的特定 PostScript 操作符。
一种有效的解决方法是修改分辨率参数以获得更好的视觉效果。rcParams["ps.distiller.res"] 参数控制 EPS 文件的分辨率,默认值为 6000。增加此值可能会导致文件变大,但可以显著提升视觉质量并保持合理的可缩放性。
示例 - 调整分辨率参数
此示例演示了如何通过调整分辨率参数来提升 EPS 文件的视觉质量。
import numpy as np
import matplotlib.pyplot as plt
# 设置 EPS 文件的分辨率
plt.rcParams["ps.distiller.res"] = 12000
# 设置图形大小并启用自动布局
plt.rcParams["figure.figsize"] = [7, 3.50]
plt.rcParams["figure.autolayout"] = True
# 生成数据
x_data = np.linspace(1, 10, 100)
y_data = np.sin(x_data)
# 绘图
plt.plot(x_data, y_data, label='Sine Wave', color='green')
# 将图形保存为 EPS 文件
plt.savefig('Output customized file.eps', format='eps', bbox_inches='tight')
print('Successfully created the output customized PostScript (EPS) file...')
输出
如果您访问保存输出的文件夹,您会看到名为 Output customized file.eps 的 PostScript 文件。
Successfully created the output customized PostScript (EPS) file...
示例 - 保留透明度
以下示例演示了通过在 savefig() 函数中设置 transparent=True 参数,在将图形保存为 .eps 文件时如何保留透明度。
import numpy as np
import matplotlib.pyplot as plt
# 调整图形大小和自动布局
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
# 生成数据
x_data = np.linspace(1, 10, 100)
y_data = np.sin(x_data)
# 使用透明度绘图数据
plt.plot(x_data, y_data, c='green', marker='o', alpha=.35, ms=10, lw=1)
plt.grid()
# 保存图形为 .eps 并保留透明度
plt.savefig("lost_transparency_img.eps", transparent=True)
# 显示图形
plt.show()
输出
执行上述代码后,您将获得以下输出 −
每当图形以 .eps/.ps 格式保存时,图形的透明度就会丢失。您可以在上图中观察到差异。