Backends#
Was ist ein Backend?#
Backends werden zum Anzeigen von Matplotlib-Figuren (siehe Einführung in Figuren) auf dem Bildschirm oder zum Schreiben in Dateien verwendet. Viele Dokumentationen auf der Website und in den Mailinglisten beziehen sich auf das "Backend" und viele neue Benutzer sind von diesem Begriff verwirrt. Matplotlib zielt auf viele verschiedene Anwendungsfälle und Ausgabeformate ab. Einige Leute verwenden Matplotlib interaktiv von der Python-Shell aus und lassen Plotfenster aufpoppen, wenn sie Befehle eingeben. Einige Leute führen Jupyter-Notebooks aus und zeichnen Inline-Plots zur schnellen Datenanalyse. Andere betten Matplotlib in grafische Benutzeroberflächen wie PyQt oder PyGObject ein, um reichhaltige Anwendungen zu erstellen. Einige Leute verwenden Matplotlib in Batch-Skripten, um Postscript-Bilder aus numerischen Simulationen zu generieren, und wieder andere betreiben Webanwendungsserver, um dynamisch Grafiken bereitzustellen.
Um all diese Anwendungsfälle zu unterstützen, kann Matplotlib auf verschiedene Ausgaben abzielen, und jede dieser Funktionen wird als Backend bezeichnet; das "Frontend" sind die benutzerorientierten Codes, d. h. der Plotcode, während das "Backend" die gesamte Hintergrundarbeit leistet, um die Figur zu erstellen. Es gibt zwei Arten von Backends: Benutzeroberflächen-Backends (für die Verwendung in PyQt/PySide, PyGObject, Tkinter, wxPython oder macOS/Cocoa); auch als "interaktive Backends" bezeichnet) und Hardcopy-Backends zur Erstellung von Bilddateien (PNG, SVG, PDF, PS; auch als "nicht-interaktive Backends" bezeichnet).
Backend auswählen#
Es gibt drei Möglichkeiten, Ihr Backend zu konfigurieren
Der Parameter
rcParams["backend"]in Ihrermatplotlibrc-DateiDie Umgebungsvariable
MPLBACKENDDie Funktion
matplotlib.use()
Unten finden Sie eine detailliertere Beschreibung.
Wenn mehr als eine Konfiguration vorhanden ist, hat die letzte aus der Liste Vorrang; z. B. überschreibt der Aufruf von matplotlib.use() die Einstellung in Ihrer matplotlibrc.
Ohne explizit gesetztes Backend wählt Matplotlib automatisch ein verwendbares Backend basierend auf dem, was auf Ihrem System verfügbar ist und ob bereits eine GUI-Ereignisschleife läuft. Das erste verwendbare Backend in der folgenden Liste wird ausgewählt: MacOSX, QtAgg, GTK4Agg, Gtk3Agg, TkAgg, WxAgg, Agg. Das Letzte, Agg, ist ein nicht-interaktives Backend, das nur in Dateien schreiben kann. Es wird unter Linux verwendet, wenn Matplotlib keine Verbindung zu einem X-Display oder einem Wayland-Display herstellen kann.
Hier ist eine detaillierte Beschreibung der Konfigurationsmethoden
Einstellung von
rcParams["backend"]in Ihrermatplotlibrc-Dateibackend : qtagg # use pyqt with antigrain (agg) rendering
Siehe auch Matplotlib mit Stilvorlagen und rcParams anpassen.
Einstellung der Umgebungsvariable
MPLBACKENDSie können die Umgebungsvariable entweder für Ihre aktuelle Shell oder für ein einzelnes Skript festlegen.
Unter Unix
> export MPLBACKEND=qtagg > python simple_plot.py > MPLBACKEND=qtagg python simple_plot.py
Unter Windows ist nur das erstere möglich
> set MPLBACKEND=qtagg > python simple_plot.py
Das Setzen dieser Umgebungsvariable überschreibt den Parameter
backendin *jeder*matplotlibrc, auch wenn sich einematplotlibrcin Ihrem aktuellen Arbeitsverzeichnis befindet. Daher wird die Einstellung vonMPLBACKENDglobal, z. B. in Ihrer.bashrcoder.profile, nicht empfohlen, da dies zu unerwartetem Verhalten führen kann.Wenn Ihr Skript von einem bestimmten Backend abhängt, können Sie die Funktion
matplotlib.use()verwendenimport matplotlib matplotlib.use('qtagg')
Dies sollte geschehen, bevor eine Figur erstellt wird, da Matplotlib andernfalls möglicherweise das Backend nicht wechseln kann und einen ImportError auslöst.
Die Verwendung von
useerfordert Änderungen in Ihrem Code, wenn Benutzer ein anderes Backend verwenden möchten. Vermeiden Sie daher,useexplizit aufzurufen, es sei denn, dies ist unbedingt erforderlich.
Die integrierten Backends#
Standardmäßig wählt Matplotlib automatisch ein Standard-Backend aus, das sowohl interaktives Arbeiten als auch das Plotten aus Skripten mit Ausgabe auf den Bildschirm und/oder in eine Datei ermöglicht, sodass Sie sich anfangs keine Sorgen über das Backend machen müssen. Die häufigste Ausnahme ist, wenn Ihre Python-Distribution ohne tkinter geliefert wird und Sie keine andere GUI-Toolkit installiert haben. Dies geschieht bei bestimmten Linux-Distributionen, bei denen Sie ein Linux-Paket namens python-tk (oder ähnlich) installieren müssen.
Wenn Sie jedoch grafische Benutzeroberflächen oder einen Webanwendungsserver (Einbetten in einen Webanwendungsserver (Flask)) erstellen möchten oder ein besseres Verständnis davon benötigen, was vor sich geht, lesen Sie weiter. Um die Anpassbarkeit für grafische Benutzeroberflächen zu erleichtern, trennt Matplotlib das Konzept des Renderers (der die eigentliche Zeichnung durchführt) vom Canvas (dem Ort, an dem die Zeichnung stattfindet). Der kanonische Renderer für Benutzeroberflächen ist Agg, der die Anti-Grain Geometry C++-Bibliothek verwendet, um ein Rasterbild (Pixelbild) der Figur zu erstellen; er wird von den Backends QtAgg, GTK4Agg, GTK3Agg, wxAgg, TkAgg und macosx verwendet. Ein alternativer Renderer basiert auf der Cairo-Bibliothek, die von QtCairo usw. verwendet wird.
Bei den Rendering-Engines können Benutzer auch zwischen Vektor- oder Raster-Renderern unterscheiden. Vektorgrafiksprachen geben Zeichenbefehle wie "zeichne eine Linie von diesem Punkt zu diesem Punkt" aus und sind daher skalierungsfrei. Raster-Backends erzeugen eine Pixelrepräsentation der Linie, deren Genauigkeit von einer DPI-Einstellung abhängt.
Statische Backends#
Hier ist eine Zusammenfassung der Matplotlib-Renderer (es gibt für jeden einen gleichnamigen Backend; dies sind *nicht-interaktive Backends*, die in eine Datei schreiben können)
Renderer |
Dateitypen |
Beschreibung |
|---|---|---|
AGG |
png |
Rastergrafiken -- hochwertige Bilder mit der Anti-Grain Geometry-Engine. |
Vektorgrafiken -- Ausgabe im Portable Document Format. |
||
PS |
ps, eps |
Vektorgrafiken -- Ausgabe in PostScript. |
SVG |
svg |
Vektorgrafiken -- Ausgabe als Scalable Vector Graphics. |
PGF |
pgf, pdf |
Vektorgrafiken -- Verwendung des pgf-Pakets. |
Cairo |
png, ps, pdf, svg |
Raster- oder Vektorgrafiken -- Verwendung der Cairo-Bibliothek (erfordert pycairo oder cairocffi). |
Um Plots mit den nicht-interaktiven Backends zu speichern, verwenden Sie die Methode matplotlib.pyplot.savefig('filename').
Interaktive Backends#
Dies sind die unterstützten Benutzeroberflächen- und Renderer-Kombinationen; dies sind *interaktive Backends*, die auf dem Bildschirm anzeigen und die entsprechenden Renderer aus der obigen Tabelle zum Schreiben in eine Datei verwenden können
Backend |
Beschreibung |
|---|---|
QtAgg |
Agg-Rendering in einem Qt-Canvas (erfordert PyQt oder Qt for Python, auch bekannt als PySide). Dieses Backend kann in IPython mit |
ipympl |
Agg-Rendering, eingebettet in ein Jupyter-Widget (erfordert ipympl). Dieses Backend kann in einem Jupyter-Notebook mit |
GTK3Agg |
Agg-Rendering auf einem GTK 3.x-Canvas (erfordert PyGObject und pycairo). Dieses Backend kann in IPython mit |
GTK4Agg |
Agg-Rendering auf einem GTK 4.x-Canvas (erfordert PyGObject und pycairo). Dieses Backend kann in IPython mit |
macosx |
Agg-Rendering in einem Cocoa-Canvas unter macOS. Dieses Backend kann in IPython mit |
TkAgg |
Agg-Rendering auf einem Tk-Canvas (erfordert TkInter). Dieses Backend kann in IPython mit |
nbAgg |
Einbetten einer interaktiven Figur in ein klassisches Jupyter-Notebook. Dieses Backend kann in Jupyter-Notebooks über |
WebAgg |
Bei |
GTK3Cairo |
Cairo-Rendering auf einem GTK 3.x-Canvas (erfordert PyGObject und pycairo). |
GTK4Cairo |
Cairo-Rendering auf einem GTK 4.x-Canvas (erfordert PyGObject und pycairo). |
wxAgg |
Agg-Rendering auf einem wxWidgets-Canvas (erfordert wxPython 4). Dieses Backend kann in IPython mit |
Hinweis
Die Namen der integrierten Backends sind nicht case-sensitiv; z. B. sind 'QtAgg' und 'qtagg' äquivalent.
ipympl#
Das ipympl-Backend befindet sich in einem separaten Paket, das explizit installiert werden muss, wenn Sie es verwenden möchten, z. B.
pip install ipympl
oder
conda install ipympl -c conda-forge
Weitere Details finden Sie unter Installation von ipympl.
Verwendung von Nicht-integrierten Backends#
Allgemeiner gesagt kann jedes importierbare Backend durch Verwendung einer der oben genannten Methoden ausgewählt werden. Wenn name.of.the.backend das Modul ist, das das Backend enthält, verwenden Sie module://name.of.the.backend als Backend-Namen, z. B. matplotlib.use('module://name.of.the.backend').
Informationen für Backend-Implementierer finden Sie unter Backend schreiben -- die Pyplot-Schnittstelle.
Fehlersuche: Fenster werden nicht angezeigt#
Manchmal funktionieren die Dinge nicht wie erwartet, meist während einer Installation.
Wenn Sie ein Notebook oder eine integrierte Entwicklungsumgebung verwenden (siehe Notebooks und IDEs), konsultieren Sie deren Dokumentation für die Fehlersuche bei nicht funktionierenden Grafiken in ihren Umgebungen.
Wenn Sie eines der Matplotlib-Grafik-Backends verwenden (siehe Eigenständige Skripte und interaktive Verwendung), stellen Sie sicher, dass Sie wissen, welches verwendet wird
import matplotlib
print(matplotlib.get_backend())
Versuchen Sie einen einfachen Plot, um zu sehen, ob die GUI geöffnet wird
import matplotlib
import matplotlib.pyplot as plt
print(matplotlib.get_backend())
plt.plot((1, 4, 6))
plt.show()
Wenn dies nicht der Fall ist, haben Sie möglicherweise ein Installationsproblem. Ein guter Schritt an diesem Punkt ist es, sicherzustellen, dass Ihr GUI-Toolkit ordnungsgemäß installiert ist und Matplotlib aus dem Test herauszunehmen. Fast alle GUI-Toolkits haben ein kleines Testprogramm, das ausgeführt werden kann, um die Grundfunktionalität zu testen. Wenn dieser Test fehlschlägt, versuchen Sie eine Neuinstallation.
QtAgg, QtCairo, Qt5Agg und Qt5Cairo#
Testen Sie PyQt5.
Wenn Sie PySide oder PyQt6 anstelle von PyQt5 installiert haben, ändern Sie einfach den Import entsprechend
python -c "from PyQt5.QtWidgets import *; app = QApplication([]); win = QMainWindow(); win.show(); app.exec()"
TkAgg und TkCairo#
Testen Sie tkinter
python3 -c "from tkinter import Tk; Tk().mainloop()"
GTK3Agg, GTK4Agg, GTK3Cairo, GTK4Cairo#
Testen Sie Gtk
python3 -c "from gi.repository import Gtk; win = Gtk.Window(); win.connect('destroy', Gtk.main_quit); win.show(); Gtk.main()"
wxAgg und wxCairo#
Testen Sie 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()
Wenn der Test für Ihr gewünschtes Backend funktioniert, Sie aber immer noch keine Figur mit Matplotlib anzeigen können, kontaktieren Sie uns (siehe Hilfe erhalten).