Noter
Cliquez ici pour télécharger l'exemple de code complet
Formatage des graduations de date à l'aide de ConciseDateFormatter #
Trouver de bonnes valeurs de graduation et formater les graduations pour un axe contenant des données de date est souvent un défi. ConciseDateFormatter
est destiné à améliorer les chaînes choisies pour les ticklabels et à minimiser autant que possible les chaînes utilisées dans ces tick labels.
Noter
Ce formateur est candidat pour devenir le formateur de tick de date par défaut dans les futures versions de Matplotlib. Veuillez signaler tout problème ou suggestion d'amélioration au référentiel github ou à la liste de diffusion.
import datetime
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
Tout d'abord, le formateur par défaut.
base = datetime.datetime(2005, 2, 1)
dates = [base + datetime.timedelta(hours=(2 * i)) for i in range(732)]
N = len(dates)
np.random.seed(19680801)
y = np.cumsum(np.random.randn(N))
fig, axs = plt.subplots(3, 1, constrained_layout=True, figsize=(6, 6))
lims = [(np.datetime64('2005-02'), np.datetime64('2005-04')),
(np.datetime64('2005-02-03'), np.datetime64('2005-02-15')),
(np.datetime64('2005-02-03 11:00'), np.datetime64('2005-02-04 13:20'))]
for nn, ax in enumerate(axs):
ax.plot(dates, y)
ax.set_xlim(lims[nn])
# rotate_labels...
for label in ax.get_xticklabels():
label.set_rotation(40)
label.set_horizontalalignment('right')
axs[0].set_title('Default Date Formatter')
plt.show()
Le formateur de date par défaut est assez verbeux, nous avons donc la possibilité d'utiliser ConciseDateFormatter
, comme indiqué ci-dessous. Notez que pour cet exemple, les étiquettes n'ont pas besoin d'être pivotées comme elles le font pour le formateur par défaut car les étiquettes sont aussi petites que possible.
fig, axs = plt.subplots(3, 1, constrained_layout=True, figsize=(6, 6))
for nn, ax in enumerate(axs):
locator = mdates.AutoDateLocator(minticks=3, maxticks=7)
formatter = mdates.ConciseDateFormatter(locator)
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)
ax.plot(dates, y)
ax.set_xlim(lims[nn])
axs[0].set_title('Concise Date Formatter')
plt.show()
Si tous les appels aux axes qui ont des dates doivent être effectués à l'aide de ce convertisseur, il est probablement plus pratique d'utiliser le registre des unités où vous effectuez des importations :
import matplotlib.units as munits
converter = mdates.ConciseDateConverter()
munits.registry[np.datetime64] = converter
munits.registry[datetime.date] = converter
munits.registry[datetime.datetime] = converter
fig, axs = plt.subplots(3, 1, figsize=(6, 6), constrained_layout=True)
for nn, ax in enumerate(axs):
ax.plot(dates, y)
ax.set_xlim(lims[nn])
axs[0].set_title('Concise Date Formatter')
plt.show()
Localisation des formats de date #
Les formats de dates peuvent être localisés si les formats par défaut ne sont pas souhaitables en manipulant l'une des trois listes de chaînes.
La formatter.formats
liste des formats est pour les étiquettes de coche normales, il y a six niveaux : années, mois, jours, heures, minutes, secondes. C'est formatter.offset_formats
ainsi que la chaîne "décalage" à droite de l'axe est formatée. C'est généralement beaucoup plus verbeux que les étiquettes de coche. Enfin, ce formatter.zero_formats
sont les formats des ticks qui sont "zéros". Ce sont des valeurs de graduation qui sont soit le premier de l'année, du mois ou du jour du mois, soit la zéroième heure, minute ou seconde. Ce sont généralement les mêmes que le format des graduations d'un niveau supérieur. Par exemple, si les limites de l'axe signifient que les graduations sont principalement des jours, nous étiquetons le 1er mars 2005 simplement avec un "Mar". Si les limites de l'axe sont principalement des heures, nous étiquetons le 4 février 00:00 simplement "Feb-4".
Notez que ces listes de formats peuvent également être transmises à en ConciseDateFormatter
tant qu'arguments de mots clés facultatifs.
Ici, nous modifions les étiquettes pour qu'elles soient "jour mois année", au lieu de l'ISO "année mois jour":
fig, axs = plt.subplots(3, 1, constrained_layout=True, figsize=(6, 6))
for nn, ax in enumerate(axs):
locator = mdates.AutoDateLocator()
formatter = mdates.ConciseDateFormatter(locator)
formatter.formats = ['%y', # ticks are mostly years
'%b', # ticks are mostly months
'%d', # ticks are mostly days
'%H:%M', # hrs
'%H:%M', # min
'%S.%f', ] # secs
# these are mostly just the level above...
formatter.zero_formats = [''] + formatter.formats[:-1]
# ...except for ticks that are mostly hours, then it is nice to have
# month-day:
formatter.zero_formats[3] = '%d-%b'
formatter.offset_formats = ['',
'%Y',
'%b %Y',
'%d %b %Y',
'%d %b %Y',
'%d %b %Y %H:%M', ]
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)
ax.plot(dates, y)
ax.set_xlim(lims[nn])
axs[0].set_title('Concise Date Formatter')
plt.show()
Enregistrement d'un convertisseur avec localisation #
ConciseDateFormatter
n'a pas d'entrées rcParams, mais la localisation peut être accomplie en passant des arguments de mots-clés à ConciseDateConverter
et en enregistrant les types de données que vous utiliserez avec le registre des unités :
import datetime
formats = ['%y', # ticks are mostly years
'%b', # ticks are mostly months
'%d', # ticks are mostly days
'%H:%M', # hrs
'%H:%M', # min
'%S.%f', ] # secs
# these can be the same, except offset by one level....
zero_formats = [''] + formats[:-1]
# ...except for ticks that are mostly hours, then its nice to have month-day
zero_formats[3] = '%d-%b'
offset_formats = ['',
'%Y',
'%b %Y',
'%d %b %Y',
'%d %b %Y',
'%d %b %Y %H:%M', ]
converter = mdates.ConciseDateConverter(
formats=formats, zero_formats=zero_formats, offset_formats=offset_formats)
munits.registry[np.datetime64] = converter
munits.registry[datetime.date] = converter
munits.registry[datetime.datetime] = converter
fig, axs = plt.subplots(3, 1, constrained_layout=True, figsize=(6, 6))
for nn, ax in enumerate(axs):
ax.plot(dates, y)
ax.set_xlim(lims[nn])
axs[0].set_title('Concise Date Formatter registered non-default')
plt.show()
Durée totale d'exécution du script : (0 minutes 3,859 secondes)