Come fare #
Perché ho così tanti tick e/o perché sono fuori servizio? #
Una causa comune per il comportamento imprevisto del tick è il passaggio di un elenco di stringhe invece di numeri o oggetti datetime . Questo può facilmente accadere senza preavviso durante la lettura in un file di testo delimitato da virgole. Matplotlib tratta gli elenchi di stringhe come variabili categoriche ( Plotting categorical variable ), e per impostazione predefinita inserisce un segno di spunta per categoria e le traccia nell'ordine in cui vengono fornite.
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(1, 2, constrained_layout=True, figsize=(6, 2))
ax[0].set_title('Ticks seem out of order / misplaced')
x = ['5', '20', '1', '9'] # strings
y = [5, 20, 1, 9]
ax[0].plot(x, y, 'd')
ax[0].tick_params(axis='x', labelcolor='red', labelsize=14)
ax[1].set_title('Many ticks')
x = [str(xx) for xx in np.arange(100)] # strings
y = np.arange(100)
ax[1].plot(x, y)
ax[1].tick_params(axis='x', labelcolor='red', labelsize=14)
( Codice sorgente , png )
La soluzione è convertire l'elenco di stringhe in numeri o oggetti datetime (spesso o
).np.asarray(numeric_strings, dtype='float')
np.asarray(datetime_strings, dtype='datetime64[s]')
Per ulteriori informazioni, vedere Correzione di troppi tick .
Determina l'estensione degli artisti nella figura #
A volte vogliamo conoscere la portata di un Artista. Gli oggetti Matplotlib Artist
hanno un metodo Artist.get_window_extent
che di solito restituisce l'estensione dell'artista in pixel. Tuttavia, alcuni artisti, in particolare il testo, devono essere resi almeno una volta prima che se ne conosca l'estensione. Matplotlib fornisce
Figure.draw_without_rendering
, che dovrebbe essere chiamato prima di chiamare
get_window_extent
.
Controlla se una cifra è vuota #
Vuoto può effettivamente significare cose diverse. La figura contiene artisti? Una figura con un vuoto Axes
conta ancora come vuoto? La figura è vuota se è stata resa di bianco puro (potrebbero esserci artisti presenti, ma potrebbero essere al di fuori dell'area di disegno o trasparenti)?
Per lo scopo qui, definiamo vuoto come: "La figura non contiene alcun artista tranne la sua patch di sfondo". L'eccezione per lo sfondo è necessaria, perché per impostazione predefinita ogni figura contiene una Rectangle
patch di sfondo. Questa definizione potrebbe essere verificata tramite:
def is_empty(figure):
"""
Return whether the figure contains no Artists (other than the default
background patch).
"""
contained_artists = figure.get_children()
return len(contained_artists) <= 1
Abbiamo deciso di non includerlo come metodo figure perché questo è solo un modo per definire il vuoto e il controllo di quanto sopra è solo raramente necessario. Di solito l'utente o il programma che gestisce la figura sa se ha aggiunto qualcosa alla figura.
Controllare se una figura verrebbe resa vuota non può essere controllato in modo affidabile se non rendendo effettivamente la figura e studiando il risultato del rendering.
Trova tutti gli oggetti in una figura di un certo tipo #
Ogni artista Matplotlib (vedi Artist tutorial ) ha un metodo chiamato findobj()
che può essere utilizzato per cercare ricorsivamente l'artista per tutti gli artisti che può contenere che soddisfano alcuni criteri (ad esempio, corrisponde a tutte le Line2D
istanze o corrisponde a una funzione di filtro arbitraria). Ad esempio, il seguente frammento trova ogni oggetto nella figura che ha una
set_color
proprietà e rende l'oggetto blu:
def myfunc(x):
return hasattr(x, 'set_color')
for o in fig.findobj(myfunc):
o.set_color('blue')
Puoi anche filtrare le istanze di classe:
import matplotlib.text as text
for o in fig.findobj(text.Text):
o.set_fontstyle('italic')
Impedisci alle ticklabel di avere un offset #
Il formattatore predefinito utilizzerà un offset per ridurre la lunghezza delle etichette di spunta. Per disattivare questa funzione in base all'asse:
ax.get_xaxis().get_major_formatter().set_useOffset(False)
set rcParams["axes.formatter.useoffset"]
(predefinito: True
), o usa un formattatore diverso. Vedere ticker
per i dettagli.
Salva figure trasparenti #
Il savefig()
comando ha un argomento chiave
transparent che, se 'True', renderà trasparenti gli sfondi della figura e degli assi durante il salvataggio, ma non influenzerà l'immagine visualizzata sullo schermo.
Se hai bisogno di un controllo più granulare, ad esempio, non vuoi una trasparenza completa o vuoi influenzare anche la versione visualizzata sullo schermo, puoi impostare direttamente le proprietà alfa. La figura ha
Rectangle
un'istanza chiamata patch
e gli assi hanno un'istanza Rectangle chiamata patch . Puoi impostare direttamente qualsiasi proprietà su di essi ( facecolor , edgecolor , linewidth ,
linestyle , alpha ). per esempio:
fig = plt.figure()
fig.patch.set_alpha(0.5)
ax = fig.add_subplot(111)
ax.patch.set_alpha(0.5)
Se hai bisogno che tutti gli elementi della figura siano trasparenti, al momento non esiste un'impostazione alfa globale, ma puoi impostare il canale alfa su singoli elementi, ad esempio:
ax.plot(x, y, alpha=0.5)
ax.set_xlabel('volts', alpha=0.5)
Salva più grafici in un unico file pdf #
Molti formati di file immagine possono avere solo un'immagine per file, ma alcuni formati supportano file multipagina. Attualmente, Matplotlib fornisce solo output multipagina ai file pdf, utilizzando i backend pdf o pgf, tramite le
classi backend_pdf.PdfPages
e .backend_pgf.PdfPages
Fai spazio alle etichette delle zecche #
Per impostazione predefinita, Matplotlib utilizza margini percentuali fissi attorno alle sottotrame. Ciò può causare la sovrapposizione o il taglio delle etichette in corrispondenza del limite della figura. Esistono diversi modi per risolvere questo problema:
Adatta manualmente i parametri della sottotrama usando
Figure.subplots_adjust
/pyplot.subplots_adjust
.Utilizzare uno dei meccanismi di layout automatico:
layout vincolato ( Guida al layout vincolato )
layout stretto ( Guida al layout stretto )
Calcola tu stesso i buoni valori dalla dimensione degli elementi della trama ( Controllo programmatico della regolazione della sottotrama )
Allinea le mie ylabel su più sottotrame #
Se hai più sottotrame l'una sull'altra e i dati y hanno scale diverse, spesso puoi ottenere ylabel che non si allineano verticalmente tra più sottotrame, il che può essere poco attraente. Per impostazione predefinita, Matplotlib posiziona la posizione x dell'etichetta y in modo che non si sovrapponga a nessuno degli y tick. È possibile ignorare questo comportamento predefinito specificando le coordinate dell'etichetta. L'esempio seguente mostra il comportamento predefinito nelle sottotrame di sinistra e l'impostazione manuale nelle sottotrame di destra.
Controlla l'ordine di disegno degli elementi della trama #
L'ordine di visualizzazione degli elementi della trama, e quindi quali elementi saranno in cima, è determinato dalla set_zorder
proprietà. Vedi Zorder Demo per una descrizione dettagliata.
Rendi uguali le proporzioni per i grafici #
La proprietà Axes set_aspect()
controlla le proporzioni degli assi. Puoi impostarlo su "auto", "uguale" o un rapporto che controlla il rapporto:
ax = fig.add_subplot(111, aspect='equal')
Vedere Proporzioni assiali uguali per un esempio completo.
Disegna più scale dell'asse y #
Una richiesta frequente è quella di avere due scale per l'asse y sinistro e destro, che è possibile utilizzare twinx()
(al momento non sono supportate più di due scale, sebbene sia nella lista dei desideri). Funziona abbastanza bene, anche se ci sono alcune stranezze quando si tenta di eseguire la panoramica e lo zoom in modo interattivo, poiché entrambe le scale non ricevono i segnali.
L'approccio utilizza twinx()
(e sua sorella
twiny()
) per utilizzare 2 assi diversi , disattivando la cornice rettangolare degli assi sul 2° asse per evitare che oscuri il primo e impostando manualmente le tacche e le etichette come desiderato. È possibile utilizzare matplotlib.ticker
formattatori e localizzatori separati come desiderato perché i due assi sono indipendenti.
( Codice sorgente , png )
Vedere Grafici con scale diverse per un esempio completo.
Genera immagini senza che appaia una finestra #
Semplicemente non chiamare show
e salva direttamente la figura nel formato desiderato:
import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.savefig('myfig.png')
Guarda anche
Incorporamento in un server di applicazioni Web (Flask) per informazioni sull'esecuzione di matplotlib all'interno di un'applicazione Web.
Lavora con i thread #
Matplotlib non è thread-safe: infatti, sono note race condition che influenzano determinati artisti. Quindi, se lavori con i thread, è tua responsabilità impostare i blocchi appropriati per serializzare l'accesso agli artisti Matplotlib.
Potresti essere in grado di lavorare su figure separate da thread separati. Tuttavia, in tal caso è necessario utilizzare un backend non interattivo (in genere Agg), poiché la maggior parte dei backend GUI richiede di essere eseguita anche dal thread principale.