2009-10-15 14 views
88

Ho una matrice di data e ora nel formato (HH: MM: SS.mmmmmm) e un'altra serie di numeri in virgola mobile, ciascuno corrispondente a un valore nella matrice di data e ora.Tempo di plottaggio in Python con Matplotlib

È possibile tracciare il tempo sull'asse xe i numeri sull'asse y utilizzando Matplotlib?

Stavo provando a, ma in qualche modo stava accettando soltanto le matrici dei galleggianti. Come posso farlo per tracciare il tempo? Devo modificare il formato in qualche modo?

risposta

107

È necessario prima convertire i timestamp in oggetti Python datetime (utilizzare datetime.strptime). Quindi utilizzare date2num per convertire le date in formato matplotlib.

trama le date e valori utilizzando plot_date:

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

traccerà la data o solo l'ora? Voglio solo il tempo trascorso da conversione a datetime, l'anno è impostato sul 1990. – randomThought

+0

"... sulla conversione in datetime, l'anno è impostato su 1990": potresti inserire il codice che usi per convertire da stringa a datetime ? Qualcosa potrebbe essere sbagliato con la conversione. Ri. la formattazione delle etichette dei grafici, vedi il link date_demo1 fornito da J. K. Seppänen. La documentazione di matplot lib è eccellente, a proposito. http://matplotlib.sourceforge.net/index.html – codeape

+11

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

52

È possibile anche tracciare il timestamp, coppie di valori utilizzando pyplot.plot (dopo di loro analisi dalla loro rappresentazione di stringa). (Testato con le versioni 1.2.0 e 1.3.1 matplotlib.)

Esempio:

Line Plot


Ecco lo stesso di un grafico a dispersione: Immagine

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() 

risultante:

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 questo:

Scatter Plot

+2

come farlo funzionare per la trama a dispersione? – andi

+4

@andi dovrebbe funzionare come nel mio esempio (cambia 'trama' in' scatter'). – moooeeeep

+1

Non capisco perché questa è la quinta domanda che ho incontrato dove nessuno ha effettivamente * TRED * usando un grafico a dispersione - non funziona. 'Tipo Errore - promozione del tipo non valido'. – dwanderson

2

7 anni più tardi e questo codice mi ha aiutato. Tuttavia, i miei tempi non venivano visualizzati correttamente.

enter image description here

Utilizzando Matplotlib 2.0.0 e ho dovuto aggiungere il seguente pezzo di codice da Editing the date formatting of x-axis tick labels in matplotlib da Paul H.

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

ho cambiato il formato da (% H:% M) e l'ora visualizzata correttamente. enter image description here

Tutto grazie alla comunità.

1

Ho avuto problemi con questo utilizzando la versione matplotlib: 2.0.2. Eseguendo l'esempio dall'alto ho ottenuto una serie di bolle impilate centrate.

graph with centered stack of bubbles

I "fisso" il problema aggiungendo un'altra riga:

plt.plot([],[]) 

L'intero 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 distribuiti come desiderato .

graph with bubbles distributed over time

+0

Grazie per la versione aggiornata. – Aventinus

Problemi correlati