Trazar el tiempo en Python con Matplotlib


163

Tengo una matriz de marcas de tiempo en el formato (HH: MM: SS.mmmmmm) y otra matriz de números de coma flotante, cada una correspondiente a un valor en la matriz de marcas de tiempo.

¿Puedo trazar el tiempo en el eje xy los números en el eje y usando Matplotlib?

Estaba tratando de hacerlo, pero de alguna manera solo aceptaba series de carrozas. ¿Cómo puedo hacer que trace el tiempo? ¿Tengo que modificar el formato de alguna manera?

Respuestas:


178

Primero debe convertir sus marcas de tiempo en datetimeobjetos de Python (uso datetime.strptime). Luego use date2numpara convertir las fechas al formato matplotlib.

Trace las fechas y valores usando plot_date:

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

2
¿trazará la fecha o solo la hora? Yo sólo quiero que el tiempo transcurrido desde la conversión de fecha y hora, el año se establece en 1990.
randomThought

"... en la conversión a fecha y hora, el año se establece en 1990": ¿Podría publicar el código que utiliza para convertir de cadena a fecha y hora? Algo podría estar mal con la conversión. Re. Para el formato de las etiquetas de los gráficos, consulte el enlace date_demo1 proporcionado por JK Seppänen. La documentación de matplot lib es excelente, por cierto. matplotlib.sourceforge.net/index.html
codeape

14
plot_dates -> matplotlib.pyplot.plot_date (fechas, valores)
Pete

3
¿Qué pasa con un diagrama de dispersión? Quiero proporcionar una matriz de tamaños para determinar el tamaño de las burbujas de dispersión, pero no hay una forma equivalente scatter_date()y obvia / directa de obtener este gráfico.
dwanderson

44
Lo anterior devuelve una lista con un objeto de tipo: matplotlib.lines.Line2D object. Ahora, ¿cómo uso esto para mostrar el gráfico?
Arindam Roychowdhury

87

También puede trazar la marca de tiempo, pares de valores usando pyplot.plot (después de analizarlos desde su representación de cadena). (Probado con matplotlib versiones 1.2.0 y 1.3.1.)

Ejemplo:

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

Imagen resultante:

Trazado de línea


Esto es lo mismo que un diagrama de dispersión:

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 una imagen similar a esta:

Gráfico de dispersión


44
@andi debería funcionar igual que en mi ejemplo (cambiar plota scatter).
moooeeeep

1
No entiendo por qué esta es la quinta pregunta que he encontrado donde nadie realmente ha TRATADO usando un diagrama de dispersión: no funciona. Type Error - invalid type promotion.
dwanderson

1
@dwanderson Entonces, tal vez estás haciendo algo mal. He agregado un ejemplo para el diagrama de dispersión con datetime.datetimeobjetos en el eje x a mi publicación.
moooeeeep

Para la grilla agregarplt.grid(True)
Christophe Roussy

1
@AimForClarity funciona para mí con matplotlib.__version__2.2.2. Sin embargo, el diagrama de dispersión tiene algunos límites x demasiado amplios establecidos por defecto. Esta respuesta parece proporcionar una solución alternativa que no sea el ajuste manual plt.xlim(...): stackoverflow.com/a/46467896/1025391
moooeeeep

23

7 años después y este código me ha ayudado. Sin embargo, mis tiempos todavía no se mostraban correctamente.

ingrese la descripción de la imagen aquí

Usando Matplotlib 2.0.0 y tuve que agregar el siguiente bit de código de Edición del formato de fecha de etiquetas de marca de eje x en matplotlib por Paul H.

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

Cambié el formato a (% H:% M) y la hora se muestra correctamente. ingrese la descripción de la imagen aquí

Todo gracias a la comunidad.


16

Tuve problemas con esto usando la versión matplotlib: 2.0.2. Al ejecutar el ejemplo desde arriba, obtuve un conjunto de burbujas apiladas centradas.

gráfico con pila de burbujas centrada

"Solucioné" el problema agregando otra línea:

plt.plot([],[])

El fragmento de código completo se convierte en:

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

Esto produce una imagen con las burbujas distribuidas como se desee.

gráfico con burbujas distribuidas en el tiempo


No funciona en py2.6 para mí. Obtengo ValueError: el límite de vista mínimo -0.05500000000000001 es menor que 1 y es un valor de fecha Matplotlib no válido. Esto sucede a menudo si pasa un valor que no es de fecha y hora a un eje que tiene unidades de fecha y hora <Tamaño de figura 432x288 con 1 ejes>
AimForClarity

Una solución a las extrañas x-lims es configurarlas por su cuenta: stackoverflow.com/questions/21423158/…
Qaswed
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.