后端#
什么是后端?#
后端用于显示 Matplotlib 图形(请参阅 图形简介),在屏幕上或写入文件。网站和邮件列表上的许多文档都提到了“后端”,许多新用户对此术语感到困惑。Matplotlib 针对许多不同的用例和输出格式。有些人从 Python shell 交互式地使用 Matplotlib,并在键入命令时弹出绘图窗口。有些人运行 Jupyter 笔记本并绘制内联图以进行快速数据分析。其他人将 Matplotlib 嵌入到 PyQt 或 PyGObject 等图形用户界面中,以构建丰富的应用程序。有些人使用 Matplotlib 在批处理脚本中从数值模拟生成 postscript 图像,还有一些人运行 Web 应用程序服务器来动态提供图形。
为了支持所有这些用例,Matplotlib 可以针对不同的输出,并且每个功能都称为后端;“前端”是面向用户的代码,即绘图代码,而“后端”则在幕后完成所有艰苦的工作以制作图形。后端有两种类型:用户界面后端(用于 PyQt/PySide、PyGObject、Tkinter、wxPython 或 macOS/Cocoa;也称为“交互式后端”)和用于制作图像文件(PNG、SVG、PDF、PS;也称为“非交互式后端”)的硬拷贝后端。
选择后端#
有三种方法可以配置您的后端
您的
matplotlibrc
文件中的rcParams["backend"]
参数MPLBACKEND
环境变量
以下是更详细的描述。
如果存在多个配置,则列表中最后一个配置优先;例如,调用 matplotlib.use()
将覆盖您的 matplotlibrc
中的设置。
如果没有显式设置后端,Matplotlib 会根据系统上可用的内容以及是否已运行 GUI 事件循环自动检测可用的后端。选择以下列表中第一个可用的后端:MacOSX、QtAgg、GTK4Agg、Gtk3Agg、TkAgg、WxAgg、Agg。最后一个 Agg 是一个非交互式后端,只能写入文件。如果 Matplotlib 无法连接到 X 显示或 Wayland 显示,则在 Linux 上使用它。
以下是配置方法的详细描述
在您的
matplotlibrc
文件中设置rcParams["backend"]
backend : qtagg # use pyqt with antigrain (agg) rendering
设置
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
中,因为它可能会导致违反直觉的行为。如果您的脚本依赖于特定的后端,则可以使用函数
matplotlib.use()
import matplotlib matplotlib.use('qtagg')
这应该在创建任何图形之前完成,否则 Matplotlib 可能无法切换后端并引发 ImportError。
内置后端#
默认情况下,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 |
栅格图形 - 使用 Anti-Grain Geometry 引擎的高质量图像。 |
PS |
ps, eps |
矢量图形 - PostScript 输出。 |
SVG |
svg |
|
PGF |
pgf, pdf |
|
Cairo |
png, ps, pdf, svg |
要使用非交互式后端保存绘图,请使用 matplotlib.pyplot.savefig('filename')
方法。
交互式后端#
这些是支持的用户界面和渲染器组合;这些是交互式后端,能够显示在屏幕上,并使用上表中的适当渲染器写入文件
后端 |
描述 |
---|---|
QtAgg |
在 Qt 画布中使用 Agg 渲染 (需要 PyQt 或 Qt for Python,也称为 PySide)。此后端可以在 IPython 中使用 |
ipympl |
嵌入在 Jupyter 小部件中的 Agg 渲染 (需要 ipympl)。此后端可以在 Jupyter 笔记本中使用 |
GTK3Agg |
在 GTK 3.x 画布中使用 Agg 渲染 (需要 PyGObject 和 pycairo)。此后端可以在 IPython 中使用 |
GTK4Agg |
在 GTK 4.x 画布中使用 Agg 渲染 (需要 PyGObject 和 pycairo)。此后端可以在 IPython 中使用 |
macosx |
在 macOS 中的 Cocoa 画布中进行 Agg 渲染。此后端可以在 IPython 中使用 |
TkAgg |
在 Tk 画布中使用 Agg 渲染 (需要 TkInter)。此后端可以在 IPython 中使用 |
nbAgg |
在 Jupyter 经典笔记本中嵌入交互式图形。此后端可以在 Jupyter 笔记本中使用 |
WebAgg |
在 |
GTK3Cairo |
|
GTK4Cairo |
|
wxAgg |
在 wxWidgets 画布中使用 Agg 渲染 (需要 wxPython 4)。此后端可以在 IPython 中使用 |
注意
内置后端的名称不区分大小写;例如,“QtAgg”和“qtagg”是等效的。
ipympl#
ipympl 后端位于一个单独的包中,如果您希望使用它,则必须显式安装它,例如
pip install ipympl
或者
conda install ipympl -c conda-forge
有关更多详细信息,请参阅 安装 ipympl。
使用非内置后端#
更一般地说,可以使用上述任何方法选择任何可导入的后端。如果 name.of.the.backend
是包含后端的模块,则使用 module://name.of.the.backend
作为后端名称,例如 matplotlib.use('module://name.of.the.backend')
。
有关后端实施者的信息,请访问 编写后端 -- pyplot 接口。
调试图形窗口不显示#
有时,事情不像预期的那样工作,通常在安装期间发生。
如果您正在使用笔记本或集成开发环境 (请参阅 笔记本和 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 工具包已正确安装,将 Matplotlib 从测试中排除。几乎所有的 GUI 工具包都有一个可以运行以测试基本功能的小测试程序。如果此测试失败,请尝试重新安装。
QtAgg、QtCairo、Qt5Agg 和 Qt5Cairo#
测试 PyQt5
。
如果您安装的是 PySide
或 PyQt6
而不是 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 显示图形,请联系我们(请参阅 获取帮助)。