J'ai mes données dans un tableau de la structure suivante,
[[1293606162197, 0, 0],
[1293605477994, 63, 0],
[1293605478057, 0, 0],
[1293605478072, 2735, 1249],
[1293606162213, 0, 0],
[1293606162229, 0, 0]]
La première colonne est Epoch time (en ms
), la seconde est y1
et le troisième est y2
. J'ai besoin d'un tracé avec le temps sur l'axe des x et y1
et y2
sur les axes Y gauche et droit.
J'ai parcouru la documentation mais je n'ai pas trouvé de moyen pour que mes graduations sur l'axe des x affichent la date et l'heure, comme "28/12 16:48", c'est-à-dire "date/mois heure: min". Toute la documentation m'aide à afficher les dates seules, mais ce n'est pas ce que je veux. Toute aide serait appréciée à ce sujet.
Et, si cela peut sembler, ce ne sont pas des devoirs. C'est en fait un suivi de ma question précédente, Lecture et représentation graphique des données lues à partir de fichiers énormes .
J'espère que ça aide. J'ai toujours eu du mal avec les dates de matplotlib. Matplotlib nécessite un format flottant qui est jours depuis Epoch. Les fonctions d'assistance num2date
et date2num
ainsi que python builtin datetime
peut être utilisé pour convertir vers/depuis. Le formatage a été retiré de l'exemple this . Vous pouvez modifier un axe sur n'importe quel tracé à un axe de date en utilisant 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()