Backend n.

Che cos'è un back-end? #

Molta documentazione sul sito web e nelle mailing list fa riferimento al "backend" e molti nuovi utenti sono confusi da questo termine. Matplotlib si rivolge a molti casi d'uso e formati di output diversi. Alcune persone usano Matplotlib in modo interattivo dalla shell Python e fanno apparire finestre di stampa quando digitano i comandi. Alcune persone eseguono notebook Jupyter e disegnano grafici in linea per una rapida analisi dei dati. Altri incorporano Matplotlib in interfacce utente grafiche come PyQt o PyGObject per creare applicazioni avanzate. Alcune persone usano Matplotlib negli script batch per generare immagini postscript da simulazioni numeriche, e altri ancora eseguono server di applicazioni Web per fornire dinamicamente grafici.

Per supportare tutti questi casi d'uso, Matplotlib può scegliere come target diversi output e ciascuna di queste funzionalità è chiamata back-end; il "frontend" è il codice rivolto all'utente, cioè il codice di tracciamento, mentre il "backend" fa tutto il duro lavoro dietro le quinte per realizzare la figura. Esistono due tipi di backend: backend dell'interfaccia utente (da utilizzare in PyQt/PySide, PyGObject, Tkinter, wxPython o macOS/Cocoa); detti anche "backend interattivi") e backend cartacei per creare file immagine (PNG, SVG, PDF, PS; detti anche "backend non interattivi").

Selezione di un backend #

Ci sono tre modi per configurare il tuo backend:

Di seguito una descrizione più dettagliata.

Se è presente più di una configurazione, ha la precedenza l'ultima della lista; ad esempio, la chiamata matplotlib.use()sovrascriverà l'impostazione nel tuo file matplotlibrc.

Senza un backend impostato in modo esplicito, Matplotlib rileva automaticamente un backend utilizzabile in base a ciò che è disponibile sul tuo sistema e se un ciclo di eventi della GUI è già in esecuzione. Viene selezionato il primo backend utilizzabile nell'elenco seguente: MacOSX, QtAgg, GTK4Agg, Gtk3Agg, TkAgg, WxAgg, Agg. L'ultimo, Agg, è un backend non interattivo che può solo scrivere su file. Viene utilizzato su Linux, se Matplotlib non può connettersi né a un display X né a un display Wayland.

Ecco una descrizione dettagliata dei metodi di configurazione:

  1. Impostazione rcParams["backend"]nel tuo matplotlibrcfile:

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

    Vedi anche Personalizzazione di Matplotlib con fogli di stile e rcParams .

  2. Impostazione delMPLBACKENDvariabile d'ambiente:

    Puoi impostare la variabile d'ambiente per la tua shell corrente o per un singolo script.

    Su Unix:

    > export MPLBACKEND=qtagg
    > python simple_plot.py
    
    > MPLBACKEND=qtagg python simple_plot.py
    

    Su Windows, solo il primo è possibile:

    > set MPLBACKEND=qtagg
    > python simple_plot.py
    

    L'impostazione di questa variabile di ambiente sovrascriverà il backendparametro in any matplotlibrc , anche se è presente matplotlibrcnella directory di lavoro corrente. Pertanto, impostazioneMPLBACKEND a livello globale, ad esempio nel tuo .bashrco .profile, è sconsigliato in quanto potrebbe portare a comportamenti controintuitivi.

  3. Se il tuo script dipende da un backend specifico puoi utilizzare la funzione matplotlib.use():

    import matplotlib
    matplotlib.use('qtagg')
    

    Questo dovrebbe essere fatto prima che venga creata qualsiasi figura, altrimenti Matplotlib potrebbe non riuscire a cambiare il back-end e sollevare un ImportError.

    L'utilizzo userichiederà modifiche al codice se gli utenti desiderano utilizzare un back-end diverso. Pertanto, dovresti evitare di chiamare esplicitamente a usemeno che non sia assolutamente necessario.

I backend integrati #

Per impostazione predefinita, Matplotlib dovrebbe selezionare automaticamente un backend predefinito che consenta sia il lavoro interattivo che la stampa da script, con output sullo schermo e/o su un file, quindi almeno inizialmente non dovrai preoccuparti del backend. L'eccezione più comune è se la tua distribuzione Python viene fornita senza tkintere non hai installato nessun altro toolkit GUI. Questo accade su alcune distribuzioni Linux, dove è necessario installare un pacchetto Linux denominato python-tk(o simile).

Se, tuttavia, desideri scrivere interfacce utente grafiche o un server di applicazioni Web ( Incorporamento in un server di applicazioni Web (Flask) ) o hai bisogno di una migliore comprensione di ciò che sta accadendo, continua a leggere. Per rendere le cose facilmente più personalizzabili per le interfacce utente grafiche, Matplotlib separa il concetto di renderer (la cosa che effettivamente fa il disegno) dalla tela (il luogo dove va il disegno). Il renderer canonico per le interfacce utente è Aggche utilizza la libreria Anti-Grain Geometry C++ per creare un'immagine raster (pixel) della figura; è utilizzato dai backend QtAgg, GTK4Agg, GTK3Agg, wxAgg, TkAgge . macosxUn riproduttore alternativo è basato sulla libreria Cairo, usata da QtCairo, ecc.

Per i motori di rendering, gli utenti possono anche distinguere tra renderer vettoriali o raster . I linguaggi di grafica vettoriale emettono comandi di disegno come "disegna una linea da questo punto a questo punto" e quindi sono privi di scala. I backend raster generano una rappresentazione in pixel della linea la cui precisione dipende da un'impostazione DPI.

Ecco un riepilogo dei renderer Matplotlib (c'è un backend omonimo per ciascuno; questi sono backend non interattivi , in grado di scrivere su un file):

Render

Tipi di file

Descrizione

AGGG

png

grafica raster : immagini di alta qualità che utilizzano il motore Anti-Grain Geometry .

PDF

PDF

grafica vettoriale -- Output in Portable Document Format .

PS

ps, eps

grafica vettoriale -- output PostScript .

SVG

svg

vector graphics -- output di grafica vettoriale scalabile .

PGF

pdf, pdf

grafica vettoriale -- usando il pacchetto pgf .

Cairo

png, ps, pdf, svg

grafica raster o vettoriale -- utilizzando la libreria Cairo (richiede pycairo o cairocffi ).

Per salvare i grafici utilizzando i backend non interattivi, utilizzare il matplotlib.pyplot.savefig('filename')metodo.

Queste sono le interfacce utente e le combinazioni di renderer supportate; questi sono backend interattivi , in grado di visualizzare sullo schermo e utilizzare renderer appropriati dalla tabella sopra per scrivere su un file:

Backend

Descrizione

QtAgg

Rendering agg in una tela Qt (richiede PyQt o Qt per Python , noto anche come PySide). Questo backend può essere attivato in IPython con .%matplotlib qt

ipympl

Rendering agg incorporato in un widget Jupyter (richiede ipympl ). Questo back-end può essere abilitato in un notebook Jupyter con .%matplotlib ipympl

GTK3Agg

Rendering agg su una tela GTK 3.x (richiede PyGObject e pycairo ). Questo backend può essere attivato in IPython con .%matplotlib gtk3

GTK4Agg

Rendering agg su una tela GTK 4.x (richiede PyGObject e pycairo ). Questo backend può essere attivato in IPython con .%matplotlib gtk4

macosx

Rendering agg in una tela Cocoa in OSX. Questo backend può essere attivato in IPython con .%matplotlib osx

TkAgg

Rendering agg su una tela Tk (richiede TkInter ). Questo backend può essere attivato in IPython con .%matplotlib tk

nbAgg

Incorpora una figura interattiva in un taccuino classico Jupyter. Questo back-end può essere abilitato nei notebook Jupyter tramite .%matplotlib notebook

WebAgg

On show()avvierà un server tornado con una figura interattiva.

GTK3Il Cairo

Rendering di Cairo su un canvas GTK 3.x (richiede PyGObject e pycairo ).

GTK4 Il Cairo

Rendering di Cairo su un canvas GTK 4.x (richiede PyGObject e pycairo ).

wxAgg

Rendering agg su un canvas wxWidgets (richiede wxPython 4). Questo backend può essere attivato in IPython con .%matplotlib wx

Nota

I nomi dei backend integrati non fanno distinzione tra maiuscole e minuscole; ad esempio, 'QtAgg' e 'qtagg' sono equivalenti.

ipympl #

L'ecosistema di widget Jupyter si sta muovendo troppo velocemente per supportare direttamente in Matplotlib. Per installare ipympl:

pip install ipympl

o

conda install ipympl -c conda-forge

Vedi installazione di ipympl per maggiori dettagli.

Come seleziono l'implementazione Qt? #

I backend QtAgg e QtCairo supportano sia Qt 5 che 6, nonché entrambi i collegamenti Python ( PyQt o Qt for Python , alias PySide). Se un'associazione è già stata caricata, verrà utilizzata per il backend Qt. In caso contrario, viene utilizzata la prima associazione disponibile, nell'ordine: PyQt6, PySide6, PyQt5, PySide2.

IlQT_APIla variabile di ambiente può essere impostata per sovrascrivere la ricerca quando non è già stato caricato nulla. Può essere impostato su (senza distinzione tra maiuscole e minuscole) PyQt6, PySide6, PyQt5 o PySide2 per scegliere la versione e l'associazione da utilizzare. Se l'implementazione scelta non è disponibile, il backend Qt non verrà caricato senza tentare altre implementazioni Qt. Vedi Associazioni Qt per maggiori dettagli.

Utilizzo di backend non integrati #

Più in generale, qualsiasi backend importabile può essere selezionato utilizzando uno dei metodi sopra. Se name.of.the.backendè il modulo che contiene il backend, utilizzare module://name.of.the.backendcome nome del backend, ad esempio matplotlib.use('module://name.of.the.backend').