web-dev-qa-db-fra.com

Histogramme en matplotlib, temps sur l'axe des x

Je suis nouveau sur matplotlib (1.3.1-2) et je ne trouve pas un bon endroit pour commencer. Je veux tracer la distribution des points dans le temps dans un histogramme avec matplotlib.

Fondamentalement, je veux tracer la somme cumulée de l'occurrence d'une date.

date
2011-12-13
2011-12-13
2013-11-01
2013-11-01
2013-06-04
2013-06-04
2014-01-01
...

Cela ferait

2011-12-13 -> 2 times
2013-11-01 -> 3 times
2013-06-04 -> 2 times
2014-01-01 -> once

Puisqu'il y aura de nombreux points sur plusieurs années, je veux définir le start date sur mon x-Axis et le end date, puis marquez n-time steps (c.-à-d. étapes d'un an) et décidez enfin du nombre de bins.

Comment pourrais-je y parvenir?

23
Stophface

Matplotlib utilise son propre format pour les dates/heures, mais fournit également des fonctions simples à convertir qui sont fournies dans le module dates. Il fournit également divers Locators et Formatters qui prennent soin de placer les graduations sur l'axe et de formater les étiquettes correspondantes. Cela devrait vous aider à démarrer:

import random
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# generate some random data (approximately over 5 years)
data = [float(random.randint(1271517521, 1429197513)) for _ in range(1000)]

# convert the Epoch format to matplotlib date format 
mpl_data = mdates.Epoch2num(data)

# plot it
fig, ax = plt.subplots(1,1)
ax.hist(mpl_data, bins=50, color='lightblue')
ax.xaxis.set_major_locator(mdates.YearLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.%y'))
plt.show()

Résultat:

enter image description here

36
hitzg

Pour compléter la réponse de Hitzg, vous pouvez utiliser AutoDateLocator et AutoDateFormatter pour que matplotlib fasse l'emplacement et le formatage pour vous:

locator = mdates.AutoDateLocator()
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(mdates.AutoDateFormatter(locator))

enter image description here

13
Will Vousden