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.