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:
Il
rcParams["backend"]
parametro nel tuomatplotlibrc
fileIl
MPLBACKEND
variabile d'ambienteLa funzione
matplotlib.use()
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:
Impostazione
rcParams["backend"]
nel tuomatplotlibrc
file:backend : qtagg # use pyqt with antigrain (agg) rendering
Vedi anche Personalizzazione di Matplotlib con fogli di stile e rcParams .
Impostazione del
MPLBACKEND
variabile 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
backend
parametro in anymatplotlibrc
, anche se è presentematplotlibrc
nella directory di lavoro corrente. Pertanto, impostazioneMPLBACKEND
a livello globale, ad esempio nel tuo.bashrc
o.profile
, è sconsigliato in quanto potrebbe portare a comportamenti controintuitivi.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
use
richiederà modifiche al codice se gli utenti desiderano utilizzare un back-end diverso. Pertanto, dovresti evitare di chiamare esplicitamente ause
meno 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 tkinter
e 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 è Agg
che utilizza la libreria Anti-Grain Geometry C++ per creare un'immagine raster (pixel) della figura; è utilizzato dai backend QtAgg
, GTK4Agg
, GTK3Agg
, wxAgg
, TkAgg
e
. macosx
Un 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 . |
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
. |
ipympl |
Rendering agg incorporato in un widget Jupyter (richiede ipympl ). Questo back-end può essere abilitato in un notebook Jupyter con
. |
GTK3Agg |
Rendering agg su una tela GTK 3.x (richiede PyGObject e
pycairo ). Questo backend può essere attivato in IPython con
. |
GTK4Agg |
Rendering agg su una tela GTK 4.x (richiede PyGObject e
pycairo ). Questo backend può essere attivato in IPython con
. |
macosx |
Rendering agg in una tela Cocoa in OSX. Questo backend può essere attivato in IPython con . |
TkAgg |
Rendering agg su una tela Tk (richiede TkInter ). Questo backend può essere attivato in IPython con . |
nbAgg |
Incorpora una figura interattiva in un taccuino classico Jupyter. Questo back-end può essere abilitato nei notebook Jupyter tramite
. |
WebAgg |
On |
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 . |
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_API
la 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.backend
come nome del backend, ad esempio
matplotlib.use('module://name.of.the.backend')
.