我对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可以生成的渲染格式和种类(矢量与栅格)方面起什么作用?
答案 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等)。这样即使您使用的后端仅支持单一格式,也可以轻松将数字保存为所有格式。