pensamiento aleatorio
Tengo una matriz de marcas de tiempo en el formato (HH:MM:SS.mmmmmm) y otra matriz de números de coma flotante, cada uno correspondiente a un valor en la matriz de marcas de tiempo.
¿Puedo trazar el tiempo en el eje x y los números en el eje y usando Matplotlib?
Estaba tratando de hacerlo, pero de alguna manera solo aceptaba matrices de flotadores. ¿Cómo puedo hacer que marque el tiempo? ¿Tengo que modificar el formato de alguna manera?
código
Actualizar:
Esta respuesta está desactualizada. desde matplotlib versión 3.5. El plot
La función ahora maneja los datos de fecha y hora directamente. Ver https://matplotlib.org/3.5.1/api/_as_gen/matplotlib.pyplot.plot_date.html
Se desaconseja el uso de plot_date. Este método existe por razones históricas y puede quedar obsoleto en el futuro.
Los datos similares a fecha y hora deben trazarse directamente usando plot.
Si necesita trazar datos numéricos simples como formato de fecha de Matplotlib o necesita establecer una zona horaria, llame a ax.xaxis.axis_date / ax.yaxis.axis_date antes de trazar. Consulte Axis.axis_date.
Respuesta antigua y desactualizada:
Primero debe convertir sus marcas de tiempo a Python datetime
objetos (uso datetime.strptime
). Entonces usa date2num
para convertir las fechas al formato matplotlib.
Trazar las fechas y los valores usando plot_date
:
import matplotlib.pyplot
import matplotlib.dates
from datetime import datetime
x_values = [datetime(2021, 11, 18, 12), datetime(2021, 11, 18, 14), datetime(2021, 11, 18, 16)]
y_values = [1.0, 3.0, 2.0]
dates = matplotlib.dates.date2num(x_values)
matplotlib.pyplot.plot_date(dates, y_values)
-
¿trazará la fecha o solo la hora? Solo quiero el tiempo desde que en la conversión a fecha y hora, el año se establece en 1990.
– pensamiento aleatorio
15 de octubre de 2009 a las 19:19
-
“… en la conversión a fecha y hora, el año se establece en 1990”: ¿Podría publicar el código que usa para convertir de cadena a fecha y hora? Algo podría estar mal con la conversión. Re. 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
– código de copia
19 de octubre de 2009 a las 13:53
-
plot_dates –> matplotlib.pyplot.plot_date(fechas,valores)
– Pete
22 de noviembre de 2010 a las 21:37
-
¿Qué pasa con un diagrama de dispersión? Quiero proporcionar una matriz de tamaño para determinar el tamaño de las burbujas de dispersión, pero no hay equivalente
scatter_date()
y no hay una forma obvia/directa de obtener este gráfico.– dwanderson
5 oct 2016 a las 16:23
-
Lo anterior devuelve una lista con un objeto de tipo: objeto matplotlib.lines.Line2D. Ahora, ¿cómo uso esto para mostrar el gráfico?
–Arindam Roychowdhury
20 de julio de 2017 a las 6:59
moooeeeeep
También puede trazar la marca de tiempo, los 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:
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:
-
@andi debería funcionar como en mi ejemplo (cambiar
plot
ascatter
).– mooooooooooooooooooooooo
10 de febrero de 2014 a las 8:02
-
No entiendo por qué esta es la quinta pregunta que encuentro donde nadie realmente INTENTÓ usando un diagrama de dispersión – no funciona.
Type Error - invalid type promotion
.– dwanderson
5 oct 2016 a las 16:21
-
@dwanderson Entonces, tal vez estés haciendo algo mal. He agregado un ejemplo para el diagrama de dispersión con
datetime.datetime
objetos en el eje x a mi publicación.– mooooooooooooooooooooooo
6 de octubre de 2016 a las 7:26
-
Para la grilla agregar
plt.grid(True)
– Christophe Roussy
30 de noviembre de 2016 a las 9:16
-
@AimForClarity funciona para mí con
matplotlib.__version__
2.2.2. Sin embargo, el gráfico de dispersión tiene algunos límites x demasiado amplios establecidos de forma predeterminada. Esta respuesta parece proporcionar una solución alternativa que no sea ajustar manualmenteplt.xlim(...)
: stackoverflow.com/a/46467896/1025391– mooooooooooooooooooooooo
14 de agosto de 2018 a las 14:08
7 años después y este código me ha ayudado. Sin embargo, mis tiempos aún no se mostraban correctamente.
Usando Matplotlib 2.0.0 y tuve que agregar el siguiente código de Edición del formato de fecha de las etiquetas de marca del 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 mostró correctamente.
Todo gracias a la comunidad.
Iglesia
Tuve problemas con esto usando la versión de matplotlib: 2.0.2. Al ejecutar el ejemplo de arriba, obtuve un conjunto de burbujas apiladas centradas.
“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.
Los marcos de datos de Pandas aún no se han mencionado. Quería mostrar cómo estos resolvieron mi problema de fecha y hora. Tengo fecha y hora al milisegundo 2021-04-01 16:05:37
. Estoy extrayendo el rendimiento de linux/haproxy de /proc para que realmente pueda formatearlo como quiera. Esto es bueno para introducir datos en una animación gráfica en vivo.
Aquí hay un vistazo al csv. (Ignore los paquetes por segunda columna que estoy usando en otro gráfico)
head -2 ~/data
date,mbps,pps
2021-04-01 16:05:37,113,9342.00
...
Mediante el uso print(dataframe.dtype)
Puedo ver cómo se leyeron los datos en:
(base) ➜ graphs ./throughput.py
date object
mbps int64
pps float64
dtype: object
Pandas extrae la cadena de fecha como “objeto”, que es solo tipo char. Usando esto tal como está en un script:
import matplotlib.pyplot as plt
import pandas as pd
dataframe = pd.read_csv("~/data")
dates = dataframe["date"]
mbps = dataframe["mbps"]
plt.plot(dates, mbps, label="mbps")
plt.title("throughput")
plt.xlabel("time")
plt.ylabel("mbps")
plt.legend()
plt.xticks(rotation=45)
plt.show()
Matplotlib representa todos los datos de tiempo en milisegundos. he añadido plt.xticks(rotation=45)
inclinar las fechas pero no es lo que quiero. Puedo convertir la fecha “objeto” a una fecha y hora64[ns]. Que matplotlib sabe cómo renderizar.
dataframe["date"] = pd.to_datetime(dataframe["date"])
Esta vez mi fecha es tipo datetime64[ns]
(base) ➜ graphs ./throughput.py
date datetime64[ns]
mbps int64
pps float64
dtype: object
Mismo guión con 1 línea de diferencia.
#!/usr/bin/env python
import matplotlib.pyplot as plt
import pandas as pd
dataframe = pd.read_csv("~/data")
# convert object to datetime64[ns]
dataframe["date"] = pd.to_datetime(dataframe["date"])
dates = dataframe["date"]
mbps = dataframe["mbps"]
plt.plot(dates, mbps, label="mbps")
plt.title("throughput")
plt.xlabel("time")
plt.ylabel("mbps")
plt.legend()
plt.xticks(rotation=45)
plt.show()
Es posible que esto no haya sido ideal para su caso de uso, pero podría ayudar a otra persona.
-
Esto me ahorró un montón de tiempo y frustración, ¡gracias por compartir! ¿Alguna idea de cómo hacer que las fechas de la etiqueta x se muestren en formato día-mes-año-hora-min?
– Rubén
29 de agosto de 2021 a las 8:31
-
¡Fresco! Sí, cree una subparcela para acceder al atributo xaxis. Este es un comentario tan difícil de mostrar, pero de mi ejemplo anterior, agregue
fig,ax = plt.subplots()
y añadirdate_form = DateFormatter("%d-%m-%Y-%H-%M")
yax.xaxis.set_major_formatter(date_form)
antes.show()
– b0bu
30 de agosto de 2021 a las 10:13
-
Esto me ahorró un montón de tiempo y frustración, ¡gracias por compartir! ¿Alguna idea de cómo hacer que las fechas de la etiqueta x se muestren en formato día-mes-año-hora-min?
– Rubén
29 de agosto de 2021 a las 8:31
-
¡Fresco! Sí, cree una subparcela para acceder al atributo xaxis. Este es un comentario tan difícil de mostrar, pero de mi ejemplo anterior, agregue
fig,ax = plt.subplots()
y añadirdate_form = DateFormatter("%d-%m-%Y-%H-%M")
yax.xaxis.set_major_formatter(date_form)
antes.show()
– b0bu
30 de agosto de 2021 a las 10:13