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

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

  1. Einstellung von rcParams["backend"] in Ihrer matplotlibrc-Datei

    backend : qtagg   # use pyqt with antigrain (agg) rendering
    

    Siehe auch Matplotlib mit Stilvorlagen und rcParams anpassen.

  2. Einstellung der Umgebungsvariable MPLBACKEND

    Sie 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 backend in *jeder* matplotlibrc, auch wenn sich eine matplotlibrc in Ihrem aktuellen Arbeitsverzeichnis befindet. Daher wird die Einstellung von MPLBACKEND global, z. B. in Ihrer .bashrc oder .profile, nicht empfohlen, da dies zu unerwartetem Verhalten führen kann.

  3. Wenn Ihr Skript von einem bestimmten Backend abhängt, können Sie die Funktion matplotlib.use() verwenden

    import 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 use erfordert Änderungen in Ihrem Code, wenn Benutzer ein anderes Backend verwenden möchten. Vermeiden Sie daher, use explizit 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.

PDF

pdf

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 %matplotlib qt aktiviert werden. Die Qt-Bindung kann über die Umgebungsvariable QT_API ausgewählt werden; weitere Details finden Sie unter Qt-Bindungen.

ipympl

Agg-Rendering, eingebettet in ein Jupyter-Widget (erfordert ipympl). Dieses Backend kann in einem Jupyter-Notebook mit %matplotlib ipympl oder %matplotlib widget aktiviert werden. Funktioniert mit Jupyter lab und notebook>=7.

GTK3Agg

Agg-Rendering auf einem GTK 3.x-Canvas (erfordert PyGObject und pycairo). Dieses Backend kann in IPython mit %matplotlib gtk3 aktiviert werden.

GTK4Agg

Agg-Rendering auf einem GTK 4.x-Canvas (erfordert PyGObject und pycairo). Dieses Backend kann in IPython mit %matplotlib gtk4 aktiviert werden.

macosx

Agg-Rendering in einem Cocoa-Canvas unter macOS. Dieses Backend kann in IPython mit %matplotlib osx aktiviert werden.

TkAgg

Agg-Rendering auf einem Tk-Canvas (erfordert TkInter). Dieses Backend kann in IPython mit %matplotlib tk aktiviert werden.

nbAgg

Einbetten einer interaktiven Figur in ein klassisches Jupyter-Notebook. Dieses Backend kann in Jupyter-Notebooks über %matplotlib notebook oder %matplotlib nbagg aktiviert werden. Funktioniert mit Jupyter notebook<7 und nbclassic.

WebAgg

Bei show() wird ein Tornado-Server mit einer interaktiven Figur gestartet.

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 %matplotlib wx aktiviert werden.

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).