Tempo di tracciamento in Python con Matplotlib


164

Ho un array di timestamp nel formato (HH: MM: SS.mmmmmm) e un altro array di numeri in virgola mobile, ciascuno corrispondente a un valore nell'array timestamp.

Posso tracciare il tempo sull'asse xe i numeri sull'asse y usando Matplotlib?

Ci stavo provando, ma in qualche modo accettava solo array di float. Come posso ottenerlo per tracciare il tempo? Devo modificare il formato in qualche modo?

Risposte:


178

Devi prima convertire i tuoi timestamp in datetimeoggetti Python (usa datetime.strptime). Quindi utilizzare date2numper convertire le date nel formato matplotlib.

Traccia le date e i valori usando plot_date:

dates = matplotlib.dates.date2num(list_of_datetimes)
matplotlib.pyplot.plot_date(dates, values)

3
traccia la data o solo l'ora? Voglio solo il tempo dal momento che per conversione datetime, l'anno è impostato su 1990.
randomThought

"... durante la conversione in datetime, l'anno è impostato su 1990": Potresti pubblicare il codice che usi per convertire da stringa a datetime? Qualcosa potrebbe essere sbagliato nella conversione. Ri. la formattazione delle etichette dei grafici, consultare il link date_demo1 fornito da JK Seppänen. La documentazione lib matplot è eccellente, BTW. matplotlib.sourceforge.net/index.html
codeape

14
plot_dates -> matplotlib.pyplot.plot_date (date, valori)
Pete

3
Che dire di un diagramma a dispersione? Voglio fornire un array di dimensioni per determinare la dimensione delle bolle di dispersione, ma non esiste un modo equivalente scatter_date()e diretto / ovvio per ottenere questo grafico.
Dwanderson,

4
Quanto sopra restituisce un elenco con un oggetto di tipo: oggetto matplotlib.lines.Line2D. Ora come posso usare questo per mostrare il grafico?
Arindam Roychowdhury,

87

Puoi anche tracciare il timestamp, le coppie di valori usando pyplot.plot (dopo averli analizzati dalla loro rappresentazione di stringa). (Testato con le versioni matplotlib 1.2.0 e 1.3.1.)

Esempio:

import datetime
import random
import matplotlib.pyplot as plt

# make up some data
x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.plot(x,y)
# beautify the x-labels
plt.gcf().autofmt_xdate()

plt.show()

Immagine risultante:

Trama linea


Ecco lo stesso di un diagramma a dispersione:

import datetime
import random
import matplotlib.pyplot as plt

# make up some data
x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.scatter(x,y)
# beautify the x-labels
plt.gcf().autofmt_xdate()

plt.show()

Produce un'immagine simile a questa:

Grafico a dispersione


4
@andi dovrebbe funzionare proprio come nel mio esempio (cambia plotin scatter).
Moooeeeep,

1
Non capisco perché questa è la quinta domanda che ho incontrato in cui nessuno ha effettivamente provato con un diagramma a dispersione - non funziona. Type Error - invalid type promotion.
dwanderson,

1
@dwanderson Quindi, forse stai sbagliando qualcosa. Ho aggiunto un esempio per il grafico a dispersione con datetime.datetimeoggetti sull'asse x al mio post.
Moooeeeep,

Per la griglia aggiungereplt.grid(True)
Christophe Roussy il

1
@AimForClarity Funziona per me con matplotlib.__version__2.2.2. Il grafico a dispersione ha alcuni limiti x eccessivamente ampi impostati di default, però. Questa risposta sembra fornire una soluzione diversa da regolare manualmente plt.xlim(...): stackoverflow.com/a/46467896/1025391
moooeeeep

23

7 anni dopo e questo codice mi ha aiutato. Tuttavia, i miei tempi non erano ancora visualizzati correttamente.

inserisci qui la descrizione dell'immagine

Usando Matplotlib 2.0.0 e ho dovuto aggiungere il seguente bit di codice da Modifica della formattazione della data delle etichette tick dell'asse x in matplotlib di Paul H.

import matplotlib.dates as mdates
myFmt = mdates.DateFormatter('%d')
ax.xaxis.set_major_formatter(myFmt)

Ho cambiato il formato in (% H:% M) e l'ora è stata visualizzata correttamente. inserisci qui la descrizione dell'immagine

Tutto grazie alla comunità.


16

Ho avuto problemi con questo usando la versione matplotlib: 2.0.2. Seguendo l'esempio dall'alto ho ottenuto una serie di bolle accatastate al centro.

grafico con pila di bolle centrata

Ho "risolto" il problema aggiungendo un'altra riga:

plt.plot([],[])

L'intero frammento di codice diventa:

import datetime
import random
import matplotlib.pyplot as plt
import matplotlib.dates as mdates


# make up some data
x = [datetime.datetime.now() + datetime.timedelta(minutes=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.plot([],[])
plt.scatter(x,y)

# beautify the x-labels
plt.gcf().autofmt_xdate()
myFmt = mdates.DateFormatter('%H:%M')
plt.gca().xaxis.set_major_formatter(myFmt)

plt.show()
plt.close()

Questo produce un'immagine con le bolle distribuite come desiderato.

grafico con bolle distribuite nel tempo


Non funziona su py2.6 per me. Ottengo ValueError: il limite di visualizzazione minimo -0,05500000000000001 è inferiore a 1 ed è un valore data Matplotlib non valido. Ciò accade spesso se si passa un valore non datetime a un asse che ha unità datetime <Dimensione figura 432x288 con 1 assi>
AimForClarity

Una soluzione per le strane x-LIMS è quello di impostare loro da soli: stackoverflow.com/questions/21423158/...
Qaswed
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.