web-dev-qa-db-fra.com

Création d'un graphique avec la date et l'heure dans les étiquettes d'axe avec matplotlib

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 .

30
Shrikant Sharat

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

result

44
Paul