后端#

什么是后端?#

后端用于显示 Matplotlib 图形(参见 Figure简介 ),在屏幕上或写入文件. 网站和邮件列表上的大量文档都提到了"后端",许多新用户对此术语感到困惑. 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
    

    设置此环境变量将覆盖任何 matplotlibrc 中的 backend 参数,即使当前工作目录中存在 matplotlibrc 也是如此.因此,不鼓励全局设置 MPLBACKEND ,例如在你的 .bashrc.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 , TkAggmacosx 后端使用. 另一种渲染器基于 Cairo 库,由 QtCairo 等使用.

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

静态后端#

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

渲染器

文件类型

描述

AGG

png

raster graphics -- 使用 Anti-Grain Geometry 引擎的高质量图像.

PDF

pdf

vector graphics -- Portable Document Format 输出.

PS

ps, eps

vector graphics -- PostScript 输出.

SVG

svg

vector graphics -- Scalable Vector Graphics 输出.

PGF

pgf, pdf

vector graphics -- 使用 pgf 包.

Cairo

png, ps, pdf, svg

raster or vector graphics -- 使用 Cairo 库 (需要 pycairocairocffi).

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

交互式后端#

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

后端

描述

QtAgg

Qt 画布中进行 Agg 渲染 (需要 PyQtQt for Python ,又名 PySide).可以通过 IPython 中的 %matplotlib qt 激活此后端.可以通过 QT_API 环境变量选择 Qt 绑定; 有关更多详细信息,请参见 QT_bindings .

ipympl

嵌入在 Jupyter 小部件中的 Agg 渲染 (需要 ipympl).可以在 Jupyter 笔记本中使用 %matplotlib ipympl%matplotlib widget 启用此后端.适用于 Jupyter labnotebook>=7 .

GTK3Agg

将 Agg 渲染到 GTK 3.x 画布 (需要 PyGObjectpycairo).可以通过 IPython 中的 %matplotlib gtk3 激活此后端.

GTK4Agg

将 Agg 渲染到 GTK 4.x 画布 (需要 PyGObjectpycairo).可以通过 IPython 中的 %matplotlib gtk4 激活此后端.

macosx

在 macOS 中将 Agg 渲染到 Cocoa 画布中.可以通过 IPython 中的 %matplotlib osx 激活此后端.

TkAgg

将 Agg 渲染到 Tk 画布 (需要 TkInter).可以通过 IPython 中的 %matplotlib tk 激活此后端.

nbAgg

在 Jupyter 经典笔记本中嵌入交互式图形.可以通过 Jupyter 笔记本中的 %matplotlib notebook%matplotlib nbagg 启用此后端.适用于 Jupyter notebook<7nbclassic .

WebAgg

show() 上将启动一个带有交互式图形的 tornado 服务器.

GTK3Cairo

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

GTK4Cairo

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

wxAgg

将 Agg 渲染到 wxWidgets 画布 (需要 wxPython 4).可以通过 IPython 中的 %matplotlib wx 激活此后端.

备注

内置后端的名称不区分大小写; 例如,"QtAgg"和"qtagg"是等效的.

ipympl#

ipympl 后端位于一个单独的包中,如果希望使用它,则必须显式安装它,例如:

pip install ipympl

conda install ipympl -c conda-forge

有关更多详细信息,请参见 installing ipympl .

使用非内置后端#

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

有关后端实现者的信息,请参见 编写后端 -- pyplot 接口 .

调试图形窗口未显示#

有时,事情并没有按预期进行,通常是在安装过程中.

如果您正在使用 Notebook 或集成开发环境 (请参见 Notebook和IDE ),请查阅其文档以调试图形在其环境中无法正常工作的问题.

如果您使用的是 Matplotlib 的图形后端之一 (请参见 独立脚本和交互使用 ),请确保您知道正在使用哪个后端:

import matplotlib

print(matplotlib.get_backend())

尝试一个简单的绘图,看看 GUI 是否打开:

import matplotlib
import matplotlib.pyplot as plt

print(matplotlib.get_backend())
plt.plot((1, 4, 6))
plt.show()

如果 GUI 没有打开,则可能存在安装问题. 此时,一个好的步骤是确保您的 GUI 工具包已正确安装,从而将 Matplotlib 排除在测试之外. 几乎所有的 GUI 工具包都有一个小的测试程序,可以运行该程序来测试基本功能. 如果此测试失败,请尝试重新安装.

QtAgg, QtCairo, Qt5Agg 和 Qt5Cairo#

测试 PyQt5 .

如果您安装的是 PySidePyQt6 而不是 PyQt5 ,只需相应地更改导入:

python -c "from PyQt5.QtWidgets import *; app = QApplication([]); win = QMainWindow(); win.show(); app.exec()"

TkAgg 和 TkCairo#

测试 tkinter :

python3 -c "from tkinter import Tk; Tk().mainloop()"

GTK3Agg, GTK4Agg, GTK3Cairo, GTK4Cairo#

测试 Gtk :

python3 -c "from gi.repository import Gtk; win = Gtk.Window(); win.connect('destroy', Gtk.main_quit); win.show(); Gtk.main()"

wxAgg 和 wxCairo#

测试 wx :

import wx

app = wx.App(False)  # Create a new app, don't redirect stdout/stderr to a window.
frame = wx.Frame(None, wx.ID_ANY, "Hello World") # A Frame is a top-level window.
frame.Show(True)     # Show the frame.
app.MainLoop()

如果测试适用于您所需的后端,但您仍然无法使 Matplotlib 显示图形,请与我们联系(参见 获取帮助 ).