2009-10-15 12 views
88

J'ai un tableau de timestamps 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 ordonnées en utilisant Matplotlib?Temps de traçage en Python avec Matplotlib

J'essayais de le faire, mais d'une façon ou d'une autre, j'acceptais uniquement des tableaux de flottants. Comment puis-je l'obtenir pour tracer le temps? Dois-je modifier le format de quelque façon que ce soit?

Répondre

107

Vous devez d'abord convertir vos horodatages en objets Python datetime (utilisez datetime.strptime). Ensuite, utilisez date2num pour convertir les dates au format matplotlib.

Représentez les dates et les valeurs en utilisant plot_date:

dates = matplotlib.dates.date2num(list_of_datetimes) 
matplotlib.pyplot.plot_date(dates, values) 
+1

va tracer la date, il ou juste le temps? Je veux seulement le temps depuis la conversion en datetime, l'année est fixée à 1990. – randomThought

+0

"... lors de la conversion en datetime, l'année est fixée à 1990": Pourriez-vous s'il vous plaît poster le code que vous utilisez pour convertir de chaîne en date ? Quelque chose pourrait mal se passer avec la conversion. Ré. la mise en forme des étiquettes de graphique, voir le lien date_demo1 fourni par J. K. Seppänen. La documentation de la librairie matplot est excellente, BTW. http://matplotlib.sourceforge.net/index.html – codeape

+11

plot_dates -> matplotlib.pyplot.plot_date (dates, valeurs) – Pete

52

Vous pouvez également tracer l'horodatage, des paires de valeurs à l'aide pyplot.plot (après les analyse de leur représentation de chaîne). (Testé avec les versions de matplotlib 1.2.0 et 1.3.1.)

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


est ici le même que un diagramme de dispersion:

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:

Scatter Plot

+2

comment l'obtenir pour scatter plot? – andi

+4

@andi cela devrait fonctionner comme dans mon exemple (changer 'plot' en' scatter'). – moooeeeep

+1

Je ne comprends pas pourquoi c'est la 5ème question que j'ai rencontrée et où personne n'a vraiment * essayé * d'utiliser un nuage de points - ça ne marche pas. 'Erreur de type - promotion de type invalide'. – dwanderson

2

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

enter image description here

En utilisant Matplotlib 2.0.0 et je devais ajouter le bit de code suivant de Editing the date formatting of x-axis tick labels in matplotlib par Paul H.

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

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

Tout cela grâce à la communauté.

1

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

graph with centered stack of bubbles

I "fixe" le problème en ajoutant une autre ligne:

plt.plot([],[]) 

L'extrait de code entier 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() 

Ceci produit une image avec les bulles réparties à volonté .

graph with bubbles distributed over time

+0

Merci pour la version mise à jour. – Aventinus

Questions connexes