Tracer le temps en Python avec Matplotlib

164

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 x et les nombres sur l'axe y en utilisant Matplotlib?

J'essayais, mais d'une manière ou d'une autre, il n'acceptait que des tableaux de flotteurs. Comment puis-je lui faire tracer l'heure? Dois-je modifier le format de quelque manière que ce soit?

au hasard
la source

Réponses:

178

Vous devez d'abord convertir vos horodatages en datetimeobjets Python (utilisation datetime.strptime). Utilisez ensuite date2numpour convertir les dates au format matplotlib.

Tracez les dates et les valeurs en utilisant plot_date:

dates = matplotlib.dates.date2num(list_of_datetimes)
matplotlib.pyplot.plot_date(dates, values)
codeape
la source
3
va-t-il tracer la date ou juste l'heure? Je veux seulement le temps depuis la conversion en datetime, l'année est fixée à 1990.
randomThought
"... lors de la conversion en datetime, l'année est définie sur 1990": Pourriez-vous s'il vous plaît poster le code que vous utilisez pour convertir une chaîne en datetime? Quelque chose ne va pas avec la conversion. Ré. la mise en forme des étiquettes des graphiques, voir le lien date_demo1 fourni par JK Seppänen. La documentation de la bibliothèque matplot est excellente, BTW. matplotlib.sourceforge.net/index.html
codeape
14
plot_dates -> matplotlib.pyplot.plot_date (dates, valeurs)
Pete
3
Et un nuage de points? Je veux fournir un tableau de taille pour déterminer la taille des bulles de dispersion, mais il n'y a pas d'équivalent scatter_date(), ni de moyen évident / direct d'obtenir ce graphique.
dwanderson
4
Ce qui précède renvoie une liste avec un objet de type: objet matplotlib.lines.Line2D. Maintenant, comment puis-je utiliser cela pour afficher le graphique?
Arindam Roychowdhury
87

Vous pouvez également tracer l'horodatage, les paires de valeurs à l'aide de pyplot.plot (après les avoir analysées à 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:

Graphique linéaire


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 similaire à celle-ci:

Nuage de points

moooeeeep
la source
4
@andi cela devrait fonctionner comme dans mon exemple (changer ploten scatter).
moooeeeep
1
Je ne comprends pas pourquoi c'est la 5ème question que j'ai rencontrée où personne n'a essayé d' utiliser un nuage de points - cela ne fonctionne pas. Type Error - invalid type promotion.
dwanderson
1
@dwanderson Alors, peut-être que vous faites quelque chose de mal. J'ai ajouté un exemple pour le nuage de points avec des datetime.datetimeobjets sur l'axe des x à mon message.
moooeeeep
Pour la grille ajouterplt.grid(True)
Christophe Roussy
1
@AimForClarity Fonctionne pour moi avec matplotlib.__version__2.2.2. Le nuage de points a cependant des limites x trop larges définies par défaut. Cette réponse semble fournir une solution de contournement autre que l'ajustement manuel plt.xlim(...): stackoverflow.com/a/46467896/1025391
moooeeeep
23

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

entrez la description de l'image ici

En utilisant Matplotlib 2.0.0 et j'ai dû ajouter le bit de code suivant de Modification du formatage de la date des étiquettes de graduation de l' axe des x dans matplotlib par 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. entrez la description de l'image ici

Tout cela grâce à la communauté.

GeorgeLPerkins
la source
16

J'ai eu des problèmes avec cela en utilisant la version matplotlib: 2.0.2. En exécutant l'exemple ci-dessus, j'ai obtenu un ensemble de bulles empilées centrées.

graphique avec pile centrée de bulles

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 réparties comme souhaité.

graphique avec des bulles réparties dans le temps

Église
la source
Ne fonctionne pas sur py2.6 pour moi. J'obtiens ValueError: la limite de vue minimum -0.05500000000000001 est inférieure à 1 et est une valeur de date Matplotlib non valide. Cela se produit souvent si vous transmettez une valeur non datetime à un axe qui a des unités datetime <Taille de la figure 432x288 avec 1 Axes>
AimForClarity
Une solution aux étranges x-lims est de les définir vous-même: stackoverflow.com/questions/21423158
...