Je voudrais faire un tracé de temps générique -vs- avec le module matplotlib de python. Mes temps sont en temps Unix mais je voudrais qu'ils apparaissent dans un format lisible sur l'axe X de l'intrigue.
J'ai lu des réponses sur le traçage avec des objets datetime mais cette méthode semble supprimer les informations heure/min/sec et Rails horodatages à la journée complète. Existe-t-il un moyen de générer ces tracés et d'afficher plus granulaire Étiquettes?
Il est possible d'appeler plt.plot(dates,values)
avec dates
étant une liste de datetime.datetime
objets. L'intrigue comprendra des xticks dans un format comme '%Y-%m-%d'
et lorsque vous effectuez un zoom avant, passez automatiquement à celui qui affiche les heures, les minutes et les secondes.
Cependant, il semble que vous souhaitiez plus de contrôle que cela. Peut-être qu'il ne montre pas les heures, les minutes, les secondes à l'échelle que vous souhaitez.
Dans ce cas, vous pouvez configurer votre propre formateur de date:
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
Malheureusement, si vous réussissez datetime.datetime
objets à plt.plot
, les xticks automatiquement choisis par matplotlib semblent toujours avoir des secondes égales à zéro. Par exemple, si vous exécutez
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()
alors vous obtenez des dates bien formatées, mais toutes les secondes xtick sont nulles.
Alors, quelle est la solution?
Si vous convertissez vous-même vos horodatages -> objets datetime.datetime -> matplotlib, et passez les datenums à plt.plot
, les secondes sont conservées.
PS. Par "datatum matplotlib", j'entends le type de nombre renvoyé par 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()