web-dev-qa-db-fra.com

Tracer le temps dans Python avec Matplotlib

J'ai un tableau d'horodatages au format (HH: MM: SS.mmmmmm) et un autre tableau de nombres à virgule flottante, chacun correspondant à une valeur dans le tableau d'horodatage.

Puis-je tracer le temps sur l'axe des x et les nombres sur l'axe des y en utilisant Matplotlib?

J'essayais de le faire, mais d'une manière ou d'une autre, il ne s'agissait que d'accepter des tableaux de flotteurs. Comment puis-je l'obtenir pour tracer le temps? Dois-je modifier le format de quelque manière que ce soit?

138
randomThought

Vous devez d’abord convertir vos horodatages en Python datetime objets (utilisez _datetime.strptime_). Utilisez ensuite _date2num_ pour convertir les dates au format matplotlib.

Tracez les dates et les valeurs avec plot_date :

_dates = matplotlib.dates.date2num(list_of_datetimes)
matplotlib.pyplot.plot_date(dates, values)
_
150
codeape

Vous pouvez également tracer les horodatages et les paires de valeurs en utilisant pyplot.plot (après les avoir analysés à partir de leur représentation sous forme de chaîne). (Testé avec les versions 1.2.0 et 1.3.1 de matplotlib.)

Exemple:

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

Image résultante:

Line Plot


Voici la même chose qu'un nuage de points:

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

Produit une image semblable à ceci:

Scatter Plot

73
moooeeeep

7 ans plus tard et ce code m'a aidé. Cependant, mes temps ne sont toujours pas affichés correctement.

enter image description here

En utilisant Matplotlib 2.0.0 et moi avons dû ajouter le code de code suivant à partir de Modification du format de date des libellés de ticks d’axe x dans matplotlib de Paul H.

import matplotlib.dates as mdates
myFmt = mdates.DateFormatter('%d')
ax.xaxis.set_major_formatter(myFmt)

J'ai changé le format en (% H:% M) et l'heure affichée correctement. enter image description here

Tout cela grâce à la communauté.

16
GeorgeLPerkins

J'ai eu du mal à utiliser cette version de matplotlib: 2.0.2. À partir de l'exemple ci-dessus, j'ai obtenu un ensemble de bulles empilées et centrées.

graph with centered stack of bubbles

J'ai "corrigé" le problème en ajoutant une autre ligne:

plt.plot([],[])

L'extrait de code complet devient:

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

Cela produit une image avec les bulles distribuées comme vous le souhaitez.

graph with bubbles distributed over time

11
Kirk