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

时间:2014-10-31 17:03:42

标签: python matplotlib format rendering

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

例如,documentation says表示' agg'后端生成PNG,"光栅图形"但如果我

import matplotlib
matplotlib.use(‘agg’)

import matplotlib.pyplot
fig, ax = matplotlib.pyplot.subplots()
#...

我可以用

fig.savefig(“thefig.pdf”)

生成PDF或

fig.savefig(“thefig.svg”)

制作矢量图形。

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

1 个答案:

答案 0 :(得分:2)

好问题! 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等)。这样即使您使用的后端仅支持单一格式,也可以轻松将数字保存为所有格式。