2010-11-03 15 views
31

Me gustaría hacer una gráfica de valor genérico -vs-time con el módulo matplotlib de python. Mis tiempos son en tiempo Unix, pero me gustaría que aparezcan en un formato legible en el eje x de la trama.graficando marcas de tiempo de unix en matplotlib

He leído las respuestas sobre cómo trazar objetos con fecha y hora, pero este método parece eliminar la información de hora/min/seg y las marcas de tiempo de rieles para todo el día. ¿Hay alguna forma de generar estos gráficos y mostrar etiquetas más granulares?

+0

Matplotlib duda _doesn't_ eliminar la información de tiempo cuando se traza datetimes ... ¿Qué estás haciendo exactamente? ¿Solo quieres cambiar el etiquetado del eje? ¿Solo desea una marca/etiqueta por punto de datos trazado? –

Respuesta

48

Es posible llamar al plt.plot(dates,values) con dates siendo una lista de objetos datetime.datetime. La trama incluirá xticks en un formato como '%Y-%m-%d' y al acercarse, cambiará automáticamente a uno que muestre horas, minutos, segundos.

Sin embargo, parece que desea más control que esto. Tal vez no muestra las horas, minutos, segundos en la escala que desea.

En ese caso, usted puede configurar su propia fecha formateador:

ax=plt.gca() 
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S') 
ax.xaxis.set_major_formatter(xfmt) 

Por desgracia, si pasa datetime.datetime objetos a plt.plot, los xticks elegidos automáticamente por matplotlib parece tener siempre segundos igual a cero. Por ejemplo, si ejecuta

import matplotlib.pyplot as plt 
import matplotlib.dates as md 
import numpy as np 
import datetime as dt 
import time 

n=20 
duration=1000 
now=time.mktime(time.localtime()) 
timestamps=np.linspace(now,now+duration,n) 
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps] 
values=np.sin((timestamps-now)/duration*2*np.pi) 
plt.subplots_adjust(bottom=0.2) 
plt.xticks(rotation=25) 
ax=plt.gca() 
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S') 
ax.xaxis.set_major_formatter(xfmt) 
plt.plot(dates,values) 
plt.show() 

alt text

fechas luego te con un formato agradable, pero todos los segundos Xtick son cero.

¿Cuál es la solución?

Si convierte sus marcas de tiempo -> datetime.datetime objects -> matplotlib datenums usted mismo, y pasa los datenums a plt.plot, entonces los segundos se conservan.

PS. Por "matplotlib datenum" me refiero al tipo de número devuelto por matplotlib.dates.date2num.

import matplotlib.pyplot as plt 
import matplotlib.dates as md 
import numpy as np 
import datetime as dt 
import time 

n=20 
duration=1000 
now=time.mktime(time.localtime()) 
timestamps=np.linspace(now,now+duration,n) 
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps] 
datenums=md.date2num(dates) 
values=np.sin((timestamps-now)/duration*2*np.pi) 
plt.subplots_adjust(bottom=0.2) 
plt.xticks(rotation=25) 
ax=plt.gca() 
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S') 
ax.xaxis.set_major_formatter(xfmt) 
plt.plot(datenums,values) 
plt.show() 

alt text

+1

Buen ejemplo! Por lo que vale, no es que los segundos se pierden por la conversión de 'date2num'. Es que el localizador de ticks está eligiendo automáticamente incluso las segundas ubicaciones para las etiquetas de tic. –

+0

@Joe: Sí, tienes toda la razón. Empecé a darme cuenta de que mientras buscaba a tientas esta cosa .... :) – unutbu

+0

¡Gran respuesta, gracias! – Matt

Cuestiones relacionadas