2011-03-31 41 views
27

tengo mis datos en una matriz de la estructura siguiente,Creación de gráfico con la fecha y la hora en las etiquetas del eje con matplotlib

[[1293606162197, 0, 0], 
[1293605477994, 63, 0], 
[1293605478057, 0, 0], 
[1293605478072, 2735, 1249], 
[1293606162213, 0, 0], 
[1293606162229, 0, 0]] 

La primera columna es el tiempo época (en ms), la segunda es y1 y tercero es y2. Necesito un diagrama con el tiempo en el eje x, y y1 y y2 en los ejes y izquierdos y derechos.

He estado buscando en la documentación pero no he podido encontrar ninguna forma de obtener mis tics del eje x para mostrar la fecha y la hora, como "28/12 16:48", es decir, "fecha/hora del mes: min ". Toda la documentación que me ayuda es mostrar fechas solo, pero eso no es lo que quiero. Cualquier ayuda sería apreciada en esto.

Y, si puede parecer, esto no es tarea. En realidad, es un seguimiento de mi pregunta anterior, Reading and graphing data read from huge files.

+0

caso el eje X representa el tiempo lineal real o se necesita sólo el 'DD/MM HH: MM' texto bajo cada tic que tiene datos? – eumiro

+0

Quiero la fecha absoluta, que tendrá que mostrarse verticalmente, ya que no se ajustará horizontalmente. –

Respuesta

42

Espero que esto ayude. Siempre he tenido problemas con las fechas de matplotlib. Matplotlib requiere un float format que es días desde época. Las funciones auxiliares num2date y date2num junto con python builtin datetime se pueden usar para convertir a/desde. El negocio de formateo se levantó del ejemplo this. Puede cambiar un eje en cualquier gráfico a un eje de fecha usando set_major_formatter.

import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib import dates 
import datetime 

a = np.array([ 
    [1293605162197, 0, 0], 
    [1293605477994, 63, 0], 
    [1293605478057, 0, 0], 
    [1293605478072, 2735, 1249], 
    [1293606162213, 0, 0], 
    [1293606162229, 0, 0]]) 

d = a[:,0] 
y1 = a[:,1] 
y2 = a[:,2] 

# convert epoch to matplotlib float format 
s = d/1000 
ms = d-1000*s # not needed? 
dts = map(datetime.datetime.fromtimestamp, s) 
fds = dates.date2num(dts) # converted 

# matplotlib date format object 
hfmt = dates.DateFormatter('%m/%d %H:%M') 

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.vlines(fds, y2, y1) 

ax.xaxis.set_major_locator(dates.MinuteLocator()) 
ax.xaxis.set_major_formatter(hfmt) 
ax.set_ylim(bottom = 0) 
plt.xticks(rotation='vertical') 
plt.subplots_adjust(bottom=.3) 
plt.show() 

result

+0

Muchas gracias Paul, lo tengo en marcha. Sin embargo, estoy tratando de crear un diagrama 'vlines', y el yaxis está comenzando desde -500 en la parte inferior, no 0. Si hago un' plot_date', entonces lo obtengo como 0. ¿Sabes cómo puedo configurarlo? a 0 (los documentos no me llevan a ninguna parte). –

+0

@Shrikant Sharat Ver mis actualizaciones. – Paul

+0

Gracias por el up Paul, hice '.set_ylim (bottom = 0)', pero todavía muestra '-500' como el valor mínimo en el eje y. –

Cuestiones relacionadas