matplotlib后端对渲染格式有什么限制?

oro*_*ome 5 python format rendering matplotlib

我对matplotlib在确定可以呈现的格式时使用的后端所扮演的角色感到困惑.

例如,文档说 'agg'后端生成PNG,"光栅图形"但是如果我

import matplotlib
matplotlib.use(‘agg’)

import matplotlib.pyplot
fig, ax = matplotlib.pyplot.subplots()
#...
Run Code Online (Sandbox Code Playgroud)

我可以用

fig.savefig(“thefig.pdf”)
Run Code Online (Sandbox Code Playgroud)

生成PDF,或

fig.savefig(“thefig.svg”)
Run Code Online (Sandbox Code Playgroud)

制作矢量图形.

后端在限制matplotlib可以生成的格式和渲染类型(矢量与栅格)方面起什么作用?

Joe*_*ton 2

好问题!后端Agg本身仅生成光栅图形。

fig.savefig('name.pdf')当您调用(或)时发生的情况.svg是后端暂时更改为生成向量输出。

每个后端都可以选择如何处理这个问题,但是对于Agg,当您保存矢量输出时,它基本上会执行以下操作:

pdf = self.switch_backends(FigureCanvasPdf)
return pdf.print_pdf(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

同样,对于 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 
Run Code Online (Sandbox Code Playgroud)

print_figure方法总体上控制保存。保存为特定格式是通过查找适当的print_<formatname>方法来处理的(请参阅FigureCanvasBase._get_print_method获取确切的详细信息)。

每个后端通过重写这些方法来指定它可以保存为哪些格式。每个的默认设置是暂时切换回相关的“基本”后端(例如,用于光栅格式的 Agg、用于 pdf 的 PDF、用于 svg 的 SVG 等)。即使您使用的后端仅支持单一格式,这也允许将数字轻松保存为所有格式。