Prestazione #
Che si tratti di esplorare i dati in modalità interattiva o di salvare in modo programmatico molti grafici, le prestazioni di rendering possono rappresentare un collo di bottiglia impegnativo nella pipeline. Matplotlib offre diversi modi per ridurre notevolmente i tempi di rendering al costo di una leggera modifica (a una tolleranza impostabile) nell'aspetto della trama. I metodi disponibili per ridurre i tempi di rendering dipendono dal tipo di trama che si sta creando.
Semplificazione del segmento di linea #
Per i grafici che hanno segmenti di linea (ad es. tipici grafici a linee, contorni di poligoni, ecc.), le prestazioni di rendering possono essere controllate da
rcParams["path.simplify"]
(default: True
) e rcParams["path.simplify_threshold"]
(default: 0.111111111111
), che possono essere definiti ad esempio nel matplotlibrc
file (vedi
Personalizzazione di Matplotlib con style sheet e rcParams per ulteriori informazioni sul matplotlibrc
file). rcParams["path.simplify"]
(predefinito: True
) è un valore booleano che indica se i segmenti di linea sono semplificati o meno.
rcParams["path.simplify_threshold"]
(predefinito: 0.111111111111
) controlla quanto i segmenti di linea sono semplificati; soglie più elevate comportano un rendering più rapido.
Lo script seguente visualizzerà prima i dati senza alcuna semplificazione, quindi visualizzerà gli stessi dati con semplificazione. Prova a interagire con entrambi:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# Setup, and create the data to plot
y = np.random.rand(100000)
y[50000:] *= 2
y[np.geomspace(10, 50000, 400).astype(int)] = -1
mpl.rcParams['path.simplify'] = True
mpl.rcParams['path.simplify_threshold'] = 0.0
plt.plot(y)
plt.show()
mpl.rcParams['path.simplify_threshold'] = 1.0
plt.plot(y)
plt.show()
Matplotlib attualmente ha come impostazione predefinita una soglia di semplificazione conservativa di 1/9
. Per modificare le impostazioni predefinite per utilizzare un valore diverso, modificare il matplotlibrc
file. In alternativa, gli utenti possono creare un nuovo stile per il plottaggio interattivo (con la massima semplificazione) e un altro stile per il plottaggio di qualità della pubblicazione (con la minima semplificazione) e attivarli secondo necessità. Vedere
Personalizzazione di Matplotlib con fogli di stile e rcParams per istruzioni su come eseguire queste azioni.
La semplificazione funziona unendo in modo iterativo i segmenti di linea in un singolo vettore fino a quando la distanza perpendicolare del segmento di linea successivo al vettore (misurata nello spazio delle coordinate di visualizzazione) è maggiore del path.simplify_threshold
parametro.
Nota
Le modifiche relative alla modalità di semplificazione dei segmenti di linea sono state apportate nella versione 2.1. Il tempo di rendering sarà ancora migliorato da questi parametri prima della 2.1, ma il tempo di rendering per alcuni tipi di dati sarà notevolmente migliorato nelle versioni 2.1 e successive.
Sottocampionamento marcatore #
Anche i marcatori possono essere semplificati, anche se in modo meno robusto rispetto ai segmenti di linea. Il sottocampionamento dei marcatori è disponibile solo per Line2D
gli oggetti (tramite la markevery
proprietà). Ovunque Line2D
vengano passati parametri di costruzione, come pyplot.plot
e Axes.plot
, markevery
è possibile utilizzare il parametro:
plt.plot(x, y, markevery=10)
L' markevery
argomento consente un sottocampionamento ingenuo o un tentativo di campionamento con spaziatura uniforme (lungo l' asse x ). Vedi la
demo di Markevery
per ulteriori informazioni.
Dividere le linee in pezzi più piccoli #
Se stai usando il backend Agg (vedi Che cos'è un backend? ), allora puoi usare rcParams["agg.path.chunksize"]
(default: 0
) Questo permette agli utenti di specificare una dimensione del blocco, e tutte le linee con più di quel numero di vertici saranno divise in più linee , ognuno dei quali ha non più di agg.path.chunksize
molti vertici. (A meno che non agg.path.chunksize
sia zero, nel qual caso non c'è il chunking.) Per alcuni tipi di dati, il chunking della linea in dimensioni ragionevoli può ridurre notevolmente il tempo di rendering.
Lo script seguente visualizzerà prima i dati senza alcuna limitazione della dimensione del blocco, quindi visualizzerà gli stessi dati con una dimensione del blocco di 10.000. La differenza può essere vista meglio quando le cifre sono grandi, prova a massimizzare la GUI e quindi a interagire con esse:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['path.simplify_threshold'] = 1.0
# Setup, and create the data to plot
y = np.random.rand(100000)
y[50000:] *= 2
y[np.geomspace(10, 50000, 400).astype(int)] = -1
mpl.rcParams['path.simplify'] = True
mpl.rcParams['agg.path.chunksize'] = 0
plt.plot(y)
plt.show()
mpl.rcParams['agg.path.chunksize'] = 10000
plt.plot(y)
plt.show()
Leggende #
Il comportamento predefinito della legenda per gli assi tenta di trovare la posizione che copre il minor numero di punti dati ( loc='best'
). Questo può essere un calcolo molto costoso se ci sono molti punti dati. In questo caso, potresti voler fornire una posizione specifica.
Usando lo stile veloce #
Lo stile veloce può essere utilizzato per impostare automaticamente i parametri di semplificazione e suddivisione in blocchi su impostazioni ragionevoli per velocizzare il tracciamento di grandi quantità di dati. Il codice seguente lo esegue:
import matplotlib.style as mplstyle
mplstyle.use('fast')
È molto leggero, quindi funziona bene con altri stili. Assicurati che lo stile veloce sia applicato per ultimo in modo che altri stili non sovrascrivano le impostazioni:
mplstyle.use(['dark_background', 'ggplot', 'fast'])