Matplotlib 将 savefig 保存为不同页面的 PDF
在实际开发中,我们通常需要将多个图形生成为一个 PDF 文件,以便于作为报告或者结果的附件。本文将介绍如何使用 Matplotlib 将多张图片保存在同一个 PDF 文件中,每一张图片对应 PDF 的一页。
阅读更多:Matplotlib 教程
生成示例数据
为了方便演示,我们使用 Matplotlib 自带数据集 iris 进行可视化。在执行下列代码前,请确保安装好了 Matplotlib 和 Pandas 库。
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')
for name, group in data.groupby('species'):
plt.figure()
plt.plot(group['sepal_length'], group['sepal_width'], 'o')
plt.title(name)
上述代码将 iris 数据集按照花的种类进行分类,并分别绘制出散点图。执行完上述代码后,你可以得到四张图像,如下所示:
Matplotlib 保存至 PDF 文件
Matplotlib 提供了 savefig() 函数用于将图形保存为各种格式的文件;其中,PDF 文件格式也被支持。下面,我们将讲解如何使用 savefig() 函数将四张图像保存为 PDF 文件。
在使用 savefig() 函数前,我们需要先将所有需要保存的图像绑定到一个 Figure 对象上。这个过程可以通过 plt.figure() 函数来实现。在创建 Figure 对象后,我们可以通过 add_subplot() 函数添加子图并在上面绘制图像。示例代码如下:
fig = plt.figure()
for i, (name, group) in enumerate(data.groupby('species')):
ax = fig.add_subplot(2, 2, i + 1)
ax.plot(group['sepal_length'], group['sepal_width'], 'o')
ax.set_title(name)
fig.savefig('output.pdf')
上述代码将四张图像绑定到一个 Figure 对象上,并将其保存为一个 PDF 文件。这里我们使用 add_subplot() 函数将 Figure 分成 2 行 2 列的格子,并在每个格子中绘制图像。可以看到,最后生成的 PDF 文件包含了四个页面,每个页面对应一个图像。
Matplotlib 指定页面大小
在生成 PDF 文件时,我们可以通过 figsize 参数指定页的大小(单位为英寸)。如果不指定的话,默认页面大小为 8″ × 6″。例如,下面的代码将页面宽度和高度均设置为 6 英寸:
fig = plt.figure(figsize=(6, 6))
for i, (name, group) in enumerate(data.groupby('species')):
ax = fig.add_subplot(2, 2, i + 1)
ax.plot(group['sepal_length'], group['sepal_width'], 'o')
ax.set_title(name)
fig.savefig('output.pdf')
通过指定页面大小,我们可以根据实际需求来生成合适的 PDF 文件。下图展示了两种不同大小的页面生成的 PDF 文件:
Matplotlib 指定页面方向
指定 PDF 页面方向只需要在保存的时候添加 orientation 参数即可。例如,将页面横向排布:
fig = plt.figure(figsize=(8, 4))
for i, (name, group) in enumerate(data.groupby('species')):
ax = fig.add_subplot(1, 2, i + 1)
ax.plot(group['sepal_length'], group['sepal_width'], 'o')
ax.set_title(name)
fig.savefig('output.pdf', orientation='landscape')
上述代码生成了一个包含两个横向页面的 PDF 文件。
Matplotlib 指定页面尺寸和边距
我们可以通过 Figure() 函数的 figsize 参数和 subplots_adjust() 函数来指定页面的尺寸和边距。subplots_adjust() 函数可以调整子图之间的间距和边距。
下面的代码演示了如何使用 figsize 和 subplots_adjust() 函数生成一个大小为 5″ × 10″ 的页面,并将每个子图的左、右侧边距都调整为 0.1:
fig = plt.figure(figsize=(5, 10))
fig.subplots_adjust(left=0.1, right=0.9)
for i, (name, group) in enumerate(data.groupby('species')):
ax = fig.add_subplot(3, 1, i + 1)
ax.plot(group['sepal_length'], group['sepal_width'], 'o')
ax.set_title(name)
fig.savefig('output.pdf')
上述代码生成了一个包含三个页面的 PDF 文件,每个页面对应一个图像。
总结
本文介绍了如何使用 Matplotlib 将多张图像保存至一个 PDF 文件中,并指定每张图像所在的页面。我们讲解了如何绑定多个图像到一个 Figure 对象上,并对页面进行不同设置,包括指定页面大小、方向、以及页面尺寸和边距的调整。Matplotlib 的 savefig() 函数提供了很多功能强大的参数,可以满足用户的不同需求,在实际开发中具有很高的实用价值。
极客笔记