好问题!这Agg
后端本身只产生光栅图形。
当你打电话时发生了什么fig.savefig('name.pdf')
(or .svg
)就是后端临时改成生成向量输出。
每个后端都可以选择如何处理这个问题,但是对于Agg
,当您保存矢量输出时,它基本上会执行以下操作:
pdf = self.switch_backends(FigureCanvasPdf)
return pdf.print_pdf(*args, **kwargs)
同样,对于 PDF 后端,如果要求保存光栅图像,它会暂时切换到 Agg。
对于非交互式后端,可以动态切换后端,因此该技术在“幕后”被广泛使用,以允许以多种格式保存图形。
更详细一点,以防您编写 matplotlib 后端:任何 matplotlib Canvas 实例都有几个print_<format>
方法:
In [24]: backend_bases.FigureCanvasBase.print_<tab>
backend_bases.FigureCanvasBase.print_bmp
backend_bases.FigureCanvasBase.print_eps
backend_bases.FigureCanvasBase.print_figure
backend_bases.FigureCanvasBase.print_jpeg
backend_bases.FigureCanvasBase.print_jpg
backend_bases.FigureCanvasBase.print_pdf
backend_bases.FigureCanvasBase.print_pgf
backend_bases.FigureCanvasBase.print_png
backend_bases.FigureCanvasBase.print_ps
backend_bases.FigureCanvasBase.print_raw
backend_bases.FigureCanvasBase.print_rgba
backend_bases.FigureCanvasBase.print_svg
backend_bases.FigureCanvasBase.print_svgz
backend_bases.FigureCanvasBase.print_tif
backend_bases.FigureCanvasBase.print_tiff
The print_figure
方法通常控制保存。保存为特定格式是通过查找适当的格式来处理的print_<formatname>
方法(参见FigureCanvasBase._get_print_method
以获得确切的详细信息)。
每个后端通过重写这些方法来指定它可以保存为哪些格式。每个的默认设置是暂时切换回相关的“基本”后端(例如,用于光栅格式的 Agg、用于 pdf 的 PDF、用于 svg 的 SVG 等)。即使您使用的后端仅支持单一格式,这也允许将数字轻松保存为所有格式。