matplotlib可以把结果以多种方式保存,比如以PNG文件,以MP4文件,以GIF文件等等,但是PDF文件在日常生活里使用也很高,因为电子书比较喜欢使用PDF的方式出版,这样可以跨不同的平台共享文件,而文件的格式不会改变,并且很容易输出纸质版本。既然PDF有这么大的应用,那么matplotlib也不会缺席这样的功能,并且它输出PDF文件的过程非常简单,只要数行代码就可以解决。
要能保存PDF文件,先要导入matplotlib的后端处理系统,其中backends.backend_pdf是管理PDF的功能,我们需要使用它的PdfPages对象,定义如下:
class matplotlib.backends.backend_pdf.PdfPages(filename, keep_empty=True, metadata=None)
这是一个可以保存多页的PDF文件的封装类。其中有三个参数:
- filename:表示保存文件的名称,或路径名称。
-
keep_empty:布尔类型,当设置为False时,当PDF文件为空时自动删除,否则保留。
-
metadata:字典类型dict,用来设置一些PDF相关的属性。
比如: {'Creator': 'My software', 'Author': 'Me', 'Title': 'Awesome'}
相关内容有:'Title', 'Author', 'Subject', 'Keywords', 'Creator', 'Producer', 'CreationDate', 'ModDate', 和 'Trapped'
。
了解这个类之后,再去使用就是易如反掌,直接拿前面学习的例子,再修改一下,就可以输出如下的PDF文件了:
整个例子的代码如下:
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits import mplot3d
from matplotlib.backends.backend_pdf import PdfPages
plt.rcParams['legend.fontsize'] = 10
#
with PdfPages('test.pdf') as pdf:
#第一页
fig = plt.figure()
ax = fig.add_subplot(1,1,1, projection = "3d")
#
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
ax.plot(x, y, 1.0, label='parametric curve', zdir = 'x')
ax.legend()
plt.title('Page1')
pdf.savefig(fig)
plt.close()
#第二页
fig = plt.figure()
# 3-D投影创建
ax = plt.axes(projection ='3d')
# 定义3个坐标轴的数据
z = np.linspace(0, 1, 100)
x = z * np.sin(25 * z)
y = z * np.cos(25 * z)
# 连接所有点成曲线
ax.plot3D(x, y, z, 'green')
ax.set_title('3D line plot')
pdf.savefig(fig)
plt.close()
在里面通过这行代码创建PDF文件:
with PdfPages('test.pdf') as pdf
这是python环境管理器的方式打开,自动关闭文件。接着创建两页PDF,使用pdf.savefig(fig)来保存,最后记得关闭画布,再创建新的画布保存。