後端#

什麼是後端?#

後端用於顯示 Matplotlib 圖形(請參閱圖形簡介),在螢幕上或寫入檔案。網站和郵件列表中的許多文件都提到「後端」,許多新使用者對這個術語感到困惑。Matplotlib 針對許多不同的使用案例和輸出格式。有些人從 Python Shell 以互動方式使用 Matplotlib,並在輸入命令時彈出繪圖視窗。有些人執行 Jupyter Notebook 並繪製內嵌圖以進行快速資料分析。其他人將 Matplotlib 嵌入 PyQt 或 PyGObject 等圖形使用者介面中,以建構豐富的應用程式。有些人使用 Matplotlib 在批次腳本中從數值模擬產生 PostScript 影像,還有一些人執行網頁應用程式伺服器來動態提供圖形。

為了支援所有這些使用案例,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. 在您的 matplotlibrc 檔案中設定 rcParams["backend"]

    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 套件。

但是,如果您想要編寫圖形使用者介面或網頁應用程式伺服器(嵌入網頁應用程式伺服器 (Flask)),或需要更了解正在發生的事情,請繼續閱讀。為了使圖形使用者介面的自訂更容易,Matplotlib 將渲染器(實際執行繪圖的物件)的概念與畫布(繪圖的去處)分開。使用者介面的標準渲染器是 Agg,它使用 Anti-Grain Geometry C++ 程式庫來製作圖形的點陣 (像素) 影像;QtAggGTK4AggGTK3AggwxAggTkAggmacosx 後端都使用它。另一種渲染器是以 Cairo 程式庫為基礎,由 QtCairo 等使用。

對於渲染引擎,使用者還可以區分向量點陣渲染器。向量圖形語言會發出類似「從這個點到這個點繪製一條線」的繪圖命令,因此不需縮放。點陣後端會產生線條的像素表示,其精確度取決於 DPI 設定。

靜態後端#

以下是 Matplotlib 渲染器 (每個渲染器都有一個同名的後端;這些是非互動式後端,能夠寫入檔案) 的摘要

渲染器

檔案類型

描述

AGG

png

點陣圖形 -- 使用 Anti-Grain Geometry 引擎的高品質影像。

PDF

pdf

向量圖形 -- 可攜式文件格式輸出。

PS

ps, eps

向量圖形 -- PostScript 輸出。

SVG

svg

向量圖形 -- 可縮放向量圖形輸出。

PGF

pgf, pdf

向量圖形 -- 使用 pgf 套件。

Cairo

png, ps, pdf, svg

點陣向量圖形 -- 使用 Cairo 函式庫 (需要 pycairocairocffi)。

要使用非互動式後端儲存繪圖,請使用 matplotlib.pyplot.savefig('filename') 方法。

互動式後端#

以下是支援的使用者介面和渲染器組合;這些是互動式後端,能夠顯示在螢幕上,並使用上表中的適當渲染器寫入檔案

後端

描述

QtAgg

Qt 畫布中進行 Agg 渲染 (需要 PyQtQt for Python,又名 PySide)。此後端可以使用 %matplotlib qt 在 IPython 中啟用。Qt 綁定可以透過 QT_API 環境變數選擇;詳情請參閱 Qt 綁定

ipympl

嵌入在 Jupyter 小工具中的 Agg 渲染 (需要 ipympl)。此後端可以使用 %matplotlib ipympl%matplotlib widget 在 Jupyter 筆記本中啟用。適用於 Jupyter labnotebook>=7

GTK3Agg

GTK 3.x 畫布中進行 Agg 渲染 (需要 PyGObjectpycairo)。此後端可以使用 %matplotlib gtk3 在 IPython 中啟用。

GTK4Agg

GTK 4.x 畫布中進行 Agg 渲染 (需要 PyGObjectpycairo)。此後端可以使用 %matplotlib gtk4 在 IPython 中啟用。

macosx

在 macOS 的 Cocoa 畫布中進行 Agg 渲染。此後端可以使用 %matplotlib osx 在 IPython 中啟用。

TkAgg

Tk 畫布中進行 Agg 渲染 (需要 TkInter)。此後端可以使用 %matplotlib tk 在 IPython 中啟用。

nbAgg

在 Jupyter 傳統筆記本中嵌入互動式圖形。此後端可以使用 %matplotlib notebook%matplotlib nbagg 在 Jupyter 筆記本中啟用。適用於 Jupyter notebook<7nbclassic

WebAgg

show() 上將啟動一個帶有互動式圖形的 tornado 伺服器。

GTK3Cairo

GTK 3.x 畫布中進行 Cairo 渲染 (需要 PyGObjectpycairo)。

GTK4Cairo

GTK 4.x 畫布中進行 Cairo 渲染 (需要 PyGObjectpycairo)。

wxAgg

wxWidgets 畫布中進行 Agg 渲染 (需要 wxPython 4)。此後端可以使用 %matplotlib wx 在 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

如果您安裝的是 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 顯示圖形,請與我們聯繫 (請參閱 取得協助)。