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. ConciseDateFormatterest 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()
Formateur de date par défaut

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()
Formateur de date concis

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()
Formateur de date concis

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.formatsliste 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_formatsainsi 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_formatssont 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()
Formateur de date concis

Enregistrement d'un convertisseur avec localisation #

ConciseDateFormattern'a pas d'entrées rcParams, mais la localisation peut être accomplie en passant des arguments de mots-clés à ConciseDateConverteret 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()
Concise Date Formatter enregistré non par défaut

Durée totale d'exécution du script : (0 minutes 3,859 secondes)

Galerie générée par Sphinx-Gallery