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?

pensamiento aleatorio
fuente

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)
codeape
fuente
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

moooeeeep
fuente
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.

GeorgeLPerkins
fuente
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

Iglesia
fuente
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