後端#
什麼是後端?#
後端用於顯示 Matplotlib 圖形(請參閱圖形簡介),在螢幕上或寫入檔案。網站和郵件列表中的許多文件都提到「後端」,許多新使用者對這個術語感到困惑。Matplotlib 針對許多不同的使用案例和輸出格式。有些人從 Python Shell 以互動方式使用 Matplotlib,並在輸入命令時彈出繪圖視窗。有些人執行 Jupyter Notebook 並繪製內嵌圖以進行快速資料分析。其他人將 Matplotlib 嵌入 PyQt 或 PyGObject 等圖形使用者介面中,以建構豐富的應用程式。有些人使用 Matplotlib 在批次腳本中從數值模擬產生 PostScript 影像,還有一些人執行網頁應用程式伺服器來動態提供圖形。
為了支援所有這些使用案例,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。
如果使用者想要使用不同的後端,使用
use
將需要在您的程式碼中進行變更。因此,除非絕對必要,否則您應避免明確呼叫use
。
內建後端#
依預設,Matplotlib 應自動選取預設後端,讓您能夠從腳本中進行互動式工作和繪圖,並將輸出顯示到螢幕和/或檔案,因此至少在最初,您不需要擔心後端。最常見的例外情況是,如果您的 Python 發行版沒有 tkinter
,並且您沒有安裝其他 GUI 工具組。這種情況發生在某些 Linux 發行版中,您需要安裝名為 python-tk
(或類似名稱) 的 Linux 套件。
但是,如果您想要編寫圖形使用者介面或網頁應用程式伺服器(嵌入網頁應用程式伺服器 (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)。此後端可以使用 |
ipympl |
嵌入在 Jupyter 小工具中的 Agg 渲染 (需要 ipympl)。此後端可以使用 |
GTK3Agg |
在 GTK 3.x 畫布中進行 Agg 渲染 (需要 PyGObject 和 pycairo)。此後端可以使用 |
GTK4Agg |
在 GTK 4.x 畫布中進行 Agg 渲染 (需要 PyGObject 和 pycairo)。此後端可以使用 |
macosx |
在 macOS 的 Cocoa 畫布中進行 Agg 渲染。此後端可以使用 |
TkAgg |
在 Tk 畫布中進行 Agg 渲染 (需要 TkInter)。此後端可以使用 |
nbAgg |
在 Jupyter 傳統筆記本中嵌入互動式圖形。此後端可以使用 |
WebAgg |
在 |
GTK3Cairo |
|
GTK4Cairo |
|
wxAgg |
在 wxWidgets 畫布中進行 Agg 渲染 (需要 wxPython 4)。此後端可以使用 |
注意
內建後端的名稱不區分大小寫;例如,'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 顯示圖形,請與我們聯繫 (請參閱 取得協助)。