后端#

什么是后端?#

网站和邮件列表中的许多文档都提到了“后端”,许多新用户对这个术语感到困惑。Matplotlib 针对许多不同的用例和输出格式。有些人从 Python shell 交互地使用 Matplotlib,并在键入命令时弹出绘图窗口。有些人运行 Jupyter笔记本并绘制内联图以进行快速数据分析。其他人将 Matplotlib 嵌入到 PyQt 或 PyGObject 等图形用户界面中,以构建丰富的应用程序。有些人在批处理脚本中使用 Matplotlib 从数值模拟中生成 postscript 图像,还有一些人运行 Web 应用程序服务器来动态提供图形。

为了支持所有这些用例,Matplotlib 可以针对不同的输出,并且这些功能中的每一个都称为后端;“前端”是面向用户的代码,即绘图代码,而“后端”在幕后完成所有艰苦的工作以制作图形。有两种类型的后端:用户界面后端(用于 PyQt/PySide、PyGObject、Tkinter、wxPython 或 macOS/Cocoa);也称为“交互式后端”)和用于制作图像文件的硬拷贝后端(PNG、SVG、PDF、PS;也称为“非交互式后端”)。

选择后端#

有三种方式来配置你的后端:

下面是更详细的描述。

如果存在多个配置,则列表中的最后一个优先;例如,调用matplotlib.use()将覆盖您的matplotlibrc.

如果没有明确设置后端,Matplotlib 会根据系统上可用的内容以及 GUI 事件循环是否已经运行来自动检测可用的后端。选择以下列表中的第一个可用后端:MacOSX、QtAgg、GTK4Agg、Gtk3Agg、TkAgg、WxAgg、Agg。最后一个,Agg,是一个只能写入文件的非交互式后端。如果 Matplotlib 无法连接到 X 显示器或 Wayland 显示器,则在 Linux 上使用它。

以下是配置方法的详细说明:

  1. rcParams["backend"]在您的matplotlibrc文件中设置:

    backend : qtagg   # use pyqt with antigrain (agg) rendering
    

    另请参阅使用样式表和 rcParams 自定义 Matplotlib

  2. 设置MPLBACKEND环境变量:

    您可以为当前 shell 或单个脚本设置环境变量。

    在 Unix 上:

    > export MPLBACKEND=qtagg
    > python simple_plot.py
    
    > MPLBACKEND=qtagg python simple_plot.py
    

    在 Windows 上,只有前者是可能的:

    > set MPLBACKEND=qtagg
    > python simple_plot.py
    

    设置此环境变量将覆盖anybackend中的参数,即使当前工作目录中有 a 也是如此。因此,设置 matplotlibrcmatplotlibrcMPLBACKEND 不鼓励全局,例如在你的.bashrcor.profile中,因为它可能导致违反直觉的行为。

  3. 如果您的脚本依赖于特定的后端,您可以使用以下函数 matplotlib.use()

    import matplotlib
    matplotlib.use('qtagg')
    

    这应该在创建任何图形之前完成,否则 Matplotlib 可能无法切换后端并引发 ImportError。

    use如果用户想要使用不同的后端,使用将需要更改您的代码。use因此,除非绝对必要,否则应避免显式调用 。

内置后端#

默认情况下,Matplotlib 应该自动选择一个默认后端,它允许交互式工作和从脚本绘图,输出到屏幕和/或文件,所以至少在最初,你不需要担心后端。最常见的例外是,如果您的 Python 发行版没有tkinter安装并且您没有安装其他 GUI 工具包。这发生在某些 Linux 发行版上,您需要在其中安装名为python-tk(或类似)的 Linux 软件包。

但是,如果您想编写图形用户界面或 Web 应用程序服务器(嵌入 Web 应用程序服务器 (Flask)),或者需要更好地了解正在发生的事情,请继续阅读。为了让图形用户界面更容易定制,Matplotlib 将渲染器(实际进行绘图的东西)的概念与画布(绘图的地方)分开。用户界面的规范渲染器是Agg使用Anti-Grain Geometry C++ 库来制作图形的光栅(像素)图像;它被QtAgg, GTK4Agg, GTK3Agg, wxAgg, TkAgg, 和 macosx后端使用。另一种渲染器基于 Cairo 库,由QtCairo等使用。

对于渲染引擎,用户还可以区分矢量渲染器或光栅渲染器。矢量图形语言发出诸如“从该点到该点画一条线”之类的绘图命令,因此是无比例的。光栅后端生成线条的像素表示,其精度取决于 DPI 设置。

这是 Matplotlib 渲染器的摘要(每个都有一个同名的后端;这些是非交互式后端,能够写入文件):

渲染器

文件类型

描述

AGG

PNG

光栅图形——使用反颗粒几何引擎的高质量图像 。

PDF格式

pdf

矢量图形——可移植文档格式输出。

附言

ps, 每股收益

矢量图形——PostScript输出。

SVG

svg

矢量图形 -可缩放矢量图形输出。

PGF

pgf, pdf

矢量图形——使用pgf包。

开罗

png, ps, pdf, svg

光栅矢量图形——使用Cairo库(需要pycairocairocffi)。

要使用非交互式后端保存绘图,请使用该 matplotlib.pyplot.savefig('filename')方法。

这些是支持的用户界面和渲染器组合;这些是交互式后端,能够显示到屏幕上并使用上表中的适当渲染器写入文件:

后端

描述

QtAgg

Qt画布中的 Agg 渲染(需要PyQtQt for Python,又名 PySide)。这个后端可以在 IPython 中使用 .%matplotlib qt

ipympl

嵌入在 Jupyter 小部件中的 Agg 渲染(需要ipympl)。可以在带有 .%matplotlib ipympl

GTK3Agg

Agg 渲染到GTK 3.x 画布(需要PyGObjectpycairo)。这个后端可以在 IPython 中使用 .%matplotlib gtk3

GTK4Agg

Agg 渲染到GTK 4.x 画布(需要PyGObjectpycairo)。这个后端可以在 IPython 中使用 .%matplotlib gtk4

macosx

在 OSX 中将 Agg 渲染到 Cocoa 画布中。这个后端可以在 IPython 中使用.%matplotlib osx

TkAgg

Agg 渲染到Tk画布(需要TkInter)。这个后端可以在 IPython 中使用.%matplotlib tk

nbAgg

在 Jupyter 经典笔记本中嵌入交互式人物。可以通过在 Jupyter 笔记本中启用此后端 。%matplotlib notebook

网络聚合

Onshow()将启动一个带有交互式图形的龙卷风服务器。

GTK3开罗

Cairo 渲染到GTK 3.x 画布(需要PyGObjectpycairo)。

GTK4开罗

Cairo 渲染到GTK 4.x 画布(需要PyGObjectpycairo)。

wxAgg

Agg 渲染到wxWidgets画布(需要wxPython 4)。这个后端可以在 IPython 中使用.%matplotlib wx

笔记

内置后端的名称不区分大小写;例如,'QtAgg' 和 'qtagg' 是等价的。

ipympl #

Jupyter 小部件生态系统发展得太快,无法直接在 Matplotlib 中提供支持。要安装 ipympl:

pip install ipympl

或者

conda install ipympl -c conda-forge

有关更多详细信息,请参阅安装 ipympl

如何选择 Qt 实现?#

QtAgg 和 QtCairo 后端支持 Qt 5 和 6,以及 Python 绑定(Python的PyQtQt,又名 PySide)。如果已经加载了任何绑定,那么它将用于 Qt 后端。否则,使用第一个可用的绑定,顺序为:PyQt6、PySide6、PyQt5、PySide2。

QT_API可以设置环境变量以在尚未加载任何内容时覆盖搜索。它可以设置为(不区分大小写)PyQt6、PySide6、PyQt5 或 PySide2 以选择要使用的版本和绑定。如果选择的实现不可用,Qt 后端将无法加载而不尝试任何其他 Qt 实现。有关更多详细信息,请参阅Qt 绑定

使用非内置后端#

更一般地,可以使用上述任何方法选择任何可导入的后端。如果name.of.the.backend是包含后端的模块,则module://name.of.the.backend用作后端名称,例如 matplotlib.use('module://name.of.the.backend').