好问题! Agg 后端本身只生成光栅图形。
当您调用fig.savefig('name.pdf')(或.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
print_figure 方法通常控制保存。通过查找适当的print_<formatname> 方法来处理保存为特定格式(有关详细信息,请参阅FigureCanvasBase._get_print_method)。
每个后端通过覆盖这些方法来指定它可以保存到哪些格式。每个的默认设置是暂时切换回相关的“基本”后端(例如光栅格式的 Agg、pdf 的 PDF、svg 的 SVG 等)。即使您使用的后端仅支持一种格式,也可以轻松地将数字保存为所有格式。