Backends #

Was ist ein Backend? #

Viele Dokumentationen auf der Website und in den Mailinglisten beziehen sich auf das "Backend", und viele neue Benutzer sind durch diesen Begriff verwirrt. Matplotlib zielt auf viele verschiedene Anwendungsfälle und Ausgabeformate ab. Einige Leute verwenden Matplotlib interaktiv von der Python-Shell aus und haben Plotting-Fenster, die auftauchen, wenn sie Befehle eingeben. Einige Leute führen Jupyter -Notebooks aus und zeichnen Inline-Plots für eine schnelle Datenanalyse. Andere betten Matplotlib in grafische Benutzeroberflächen wie PyQt oder PyGObject ein, um umfangreiche Anwendungen zu erstellen. Einige Leute verwenden Matplotlib in Batch-Skripten, um Postscript-Bilder aus numerischen Simulationen zu generieren, und wieder andere betreiben Webanwendungsserver, um Diagramme dynamisch bereitzustellen.

Um alle diese Anwendungsfälle zu unterstützen, kann Matplotlib auf verschiedene Ausgaben abzielen, und jede dieser Funktionen wird als Backend bezeichnet. Das „Frontend“ ist der benutzerseitige Code, dh der Plotcode, während das „Backend“ die ganze harte Arbeit hinter den Kulissen erledigt, um die Figur zu erstellen. Es gibt zwei Arten von Backends: Benutzeroberflächen-Backends (zur Verwendung in PyQt/PySide, PyGObject, Tkinter, wxPython oder macOS/Cocoa); auch als "interaktive Backends" bezeichnet) und Hardcopy-Backends zum Erstellen von Bilddateien (PNG, SVG, PDF, PS; auch als "nicht interaktive Backends" bezeichnet).

Auswahl eines Backends #

Es gibt drei Möglichkeiten, Ihr Backend zu konfigurieren:

Nachfolgend finden Sie eine genauere Beschreibung.

Wenn mehr als eine Konfiguration vorhanden ist, hat die letzte aus der Liste Vorrang; zB matplotlib.use()überschreibt ein Anruf die Einstellung in Ihrer matplotlibrc.

Ohne ein explizit festgelegtes Backend erkennt Matplotlib automatisch ein verwendbares Backend, basierend darauf, was auf Ihrem System verfügbar ist und ob bereits eine GUI-Ereignisschleife ausgeführt wird. 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 rcParams["backend"]in Ihrer matplotlibrcDatei:

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

    Siehe auch Anpassen von Matplotlib mit Stylesheets und rcParams .

  2. Einstellung derMPLBACKENDUmgebungsvariable:

    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 ersteres möglich:

    > set MPLBACKEND=qtagg
    > python simple_plot.py
    

    Das Setzen dieser Umgebungsvariable überschreibt den backendParameter in jedem matplotlibrc , selbst wenn sich ein matplotlibrcin Ihrem aktuellen Arbeitsverzeichnis befindet. Daher EinstellungMPLBACKEND global, z. B. in Ihrem .bashrcoder .profile, wird davon abgeraten, da dies zu kontraintuitivem Verhalten führen könnte.

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

    import matplotlib
    matplotlib.use('qtagg')
    

    Dies sollte erfolgen, bevor eine Figur erstellt wird, da Matplotlib sonst möglicherweise das Backend nicht umschaltet und einen ImportError auslöst.

    Die Verwendung useerfordert Änderungen in Ihrem Code, wenn Benutzer ein anderes Backend verwenden möchten. Daher sollten Sie explizite Aufrufe vermeiden, usees sei denn, dies ist unbedingt erforderlich.

Die eingebauten Backends #

Standardmäßig sollte Matplotlib automatisch ein Standard-Backend auswählen, das sowohl interaktives Arbeiten als auch das Plotten aus Skripten mit Ausgabe auf dem Bildschirm und/oder in eine Datei ermöglicht, sodass Sie sich zumindest anfangs keine Gedanken über das Backend machen müssen. Die häufigste Ausnahme ist, wenn Ihre Python-Distribution ohne kommt tkinterund Sie kein anderes GUI-Toolkit installiert haben. python-tkDies geschieht bei bestimmten Linux-Distributionen, bei denen Sie ein Linux-Paket namens (oder ähnlich) installieren müssen .

Wenn Sie jedoch grafische Benutzeroberflächen oder einen Webanwendungsserver schreiben möchten ( Einbetten in einen Webanwendungsserver (Flask) ) oder ein besseres Verständnis dafür benötigen, was vor sich geht, lesen Sie weiter. Um die Dinge für grafische Benutzeroberflächen leichter anpassbar zu machen, trennt Matplotlib das Konzept des Renderers (das Ding, das tatsächlich die Zeichnung ausführt) von der Leinwand (dem Ort, an dem die Zeichnung hingeht). Der kanonische Renderer für Benutzeroberflächen Aggverwendet die C++-Bibliothek Anti-Grain Geometry , um ein Rasterbild (Pixelbild) der Figur zu erstellen. Es wird von den Backends QtAgg, GTK4Agg, GTK3Agg, wxAgg, TkAggund verwendet. macosxEin alternativer Renderer basiert auf der Cairo-Bibliothek, die von verwendet wird QtCairo, etc.

Auch bei den Rendering-Engines können Anwender zwischen Vektor- oder Raster - Renderern unterscheiden. Vektorgrafiksprachen geben Zeichenbefehle wie „eine Linie von diesem Punkt zu diesem Punkt zeichnen“ aus und sind daher skalierungsfrei. Raster-Backends generieren eine Pixeldarstellung der Linie, deren Genauigkeit von einer DPI-Einstellung abhängt.

Hier ist eine Zusammenfassung der Matplotlib -Renderer (es gibt für jeden ein gleichnamiges Backend; dies sind nicht interaktive Backends , die in eine Datei schreiben können):

Renderer

Datentypen

Beschreibung

AGG

png

Rastergrafiken – hochwertige Bilder mit der Anti-Korn-Geometrie- Engine.

Pdf

pdf

Vektorgrafiken -- Ausgabe im Portable Document Format .

PS

ps, eps

VektorgrafikenPostScript - Ausgabe.

SVG

SVG

Vektorgrafiken -- Skalierbare Vektorgrafikausgabe .

PGF

pgf, pdf

Vektorgrafiken -- mit dem pgf -Paket.

Kairo

png, ps, pdf, svg

Raster- oder Vektorgrafiken – mit der Cairo - Bibliothek (erfordert pycairo oder cairocffi ).

Um Diagramme mit den nicht interaktiven Backends zu speichern, verwenden Sie die matplotlib.pyplot.savefig('filename')Methode.

Dies sind die unterstützten Benutzeroberflächen und Renderer-Kombinationen; Dies sind interaktive Backends , die auf dem Bildschirm angezeigt werden können und geeignete Renderer aus der obigen Tabelle verwenden, um in eine Datei zu schreiben:

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

ipympl

Agg-Rendering eingebettet in ein Jupyter-Widget (erfordert ipympl ). Dieses Back-End kann in einem Jupyter-Notebook mit aktiviert werden .%matplotlib ipympl

GTK3Agg

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

GTK4Agg

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

Mac OS X

Agg-Rendering in eine Cocoa-Leinwand in OSX. Dieses Backend kann in IPython mit aktiviert werden .%matplotlib osx

TkAgg

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

nbAgg

Betten Sie eine interaktive Figur in ein klassisches Jupyter-Notebook ein. Dieses Back-End kann in Jupyter-Notebooks über aktiviert werden .%matplotlib notebook

WebAgg

On show()startet einen Tornado-Server mit einer interaktiven Figur.

GTK3Cairo

Cairo-Rendering auf einer GTK 3.x-Leinwand (erfordert PyGObject und pycairo ).

GTK4Cairo

Cairo-Rendering auf einem GTK 4.x-Canvas (erfordert PyGObject und pycairo ).

wxAgg

Agg-Rendering auf einer wxWidgets- Leinwand (erfordert wxPython 4). Dieses Backend kann in IPython mit aktiviert werden .%matplotlib wx

Notiz

Bei den Namen der eingebauten Backends wird die Groß-/Kleinschreibung nicht beachtet; zB sind 'QtAgg' und 'qtagg' äquivalent.

ipympl #

Das Jupyter-Widget-Ökosystem entwickelt sich zu schnell, um es direkt in Matplotlib zu unterstützen. So installieren Sie ipympl:

pip install ipympl

oder

conda install ipympl -c conda-forge

Siehe Installieren von ipympl für weitere Details.

Wie wähle ich die Qt-Implementierung aus? #

Die QtAgg- und QtCairo-Backends unterstützen sowohl Qt 5 und 6 als auch beide Python-Bindungen ( PyQt oder Qt for Python , auch bekannt als PySide). Wenn bereits eine Bindung geladen wurde, wird sie für das Qt-Backend verwendet. Andernfalls wird die erste verfügbare Bindung in der folgenden Reihenfolge verwendet: PyQt6, PySide6, PyQt5, PySide2.

DasQT_APIDie Umgebungsvariable kann so eingestellt werden, dass sie die Suche außer Kraft setzt, wenn noch nichts geladen wurde. Es kann (ohne Berücksichtigung der Groß-/Kleinschreibung) auf PyQt6, PySide6, PyQt5 oder PySide2 gesetzt werden, um die zu verwendende Version und Bindung auszuwählen. Wenn die ausgewählte Implementierung nicht verfügbar ist, kann das Qt-Backend nicht geladen werden, ohne andere Qt-Implementierungen zu versuchen. Weitere Einzelheiten finden Sie unter Qt-Bindungen .

Verwenden von nicht integrierten Backends #

Allgemeiner kann jedes importierbare Backend mit einer der oben genannten Methoden ausgewählt werden. Wenn name.of.the.backendes sich um das Modul handelt, das das Backend enthält, verwenden Sie module://name.of.the.backendals Backend-Namen, z . B. matplotlib.use('module://name.of.the.backend').