Matplotlib怎么输出PostScript文件?

文章导读
Previous Quiz Next PostScript 是一种页面描述语言,也是一种动态类型、基于栈的编程语言,常简称为 PS。它由 Adobe Systems 在 20 世纪 80 年代初创建,主要用于描述打印页面的布局和图形。它广泛应用于电子出版和桌面出版应用中。
📋 目录
  1. Matplotlib 中的 PostScript
  2. 创建 PostScript 文件
  3. 自定义 PostScript 输出
A A

Matplotlib - PostScript



Previous
Quiz
Next

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()

输出

执行上述代码后,您将获得以下输出 −

postscript_ex3

每当图形以 .eps/.ps 格式保存时,图形的透明度就会丢失。您可以在上图中观察到差异。