Formatteur d'échelles de date de Matplotlib

MatplotlibMatplotlibBeginner
Pratiquer maintenant

This tutorial is from open-source community. Access the source code

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Le ~.dates.ConciseDateFormatter est un outil pratique pour formater les étiquettes de date sur les graduations lorsqu'on travaille avec Matplotlib. Dans ce laboratoire, vous allez apprendre à utiliser ce formateur pour améliorer les chaînes choisies pour les étiquettes de graduation et pour réduire au minimum le nombre de caractères utilisés dans ces étiquettes.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet d'adresses pour accéder à Jupyter Notebook et pratiquer.

Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations de Jupyter Notebook.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.

Formateur par défaut

Nous commençons par examiner le formateur par défaut et sa sortie verbeuse. Nous traçons des données en fonction du temps et observons comment le formateur par défaut affiche la date et l'heure.

import datetime
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.dates as mdates

## créer des données temporelles
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))

## tracer les données
fig, axs = plt.subplots(3, 1, layout='constrained', 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])
    ## rotation des étiquettes...
    for label in ax.get_xticklabels():
        label.set_rotation(40)
        label.set_horizontalalignment('right')
axs[0].set_title('Formateur de date par défaut')
plt.show()

Formateur de date concise

Ensuite, nous explorons le ~.dates.ConciseDateFormatter et sa sortie. Nous créons un nouveau tracé avec le formateur de date concise et observons comment il diffère du formateur par défaut.

fig, axs = plt.subplots(3, 1, layout='constrained', 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('Formateur de date concise')
plt.show()

Enregistrement d'un convertisseur

Si tous les appels à des axes qui ont des dates doivent être effectués en utilisant ce convertisseur, il est probablement le plus pratique d'utiliser le registre d'unités. Nous enregistrons un convertisseur avec le registre d'unités et traçons des données en utilisant le formateur de date concise.

import datetime
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), layout='constrained')
for nn, ax in enumerate(axs):
    ax.plot(dates, y)
    ax.set_xlim(lims[nn])
axs[0].set_title('Formateur de date concise')
plt.show()

Localisation des formats de date

Les formats de date peuvent être localisés si les formats par défaut ne sont pas souhaitables en manipulant l'une des trois listes de chaînes de caractères. Nous modifions les étiquettes pour qu'elles soient au format "jour mois année", au lieu du format ISO "année mois jour".

fig, axs = plt.subplots(3, 1, layout='constrained', figsize=(6, 6))

for nn, ax in enumerate(axs):
    locator = mdates.AutoDateLocator()
    formatter = mdates.ConciseDateFormatter(locator)
    formatter.formats = ['%y',  ## les graduations sont principalement en années
                         '%b',       ## les graduations sont principalement en mois
                         '%d',       ## les graduations sont principalement en jours
                         '%H:%M',    ## heures
                         '%H:%M',    ## minutes
                         '%S.%f', ]  ## secondes
    ## ces formats sont principalement ceux du niveau au-dessus...
    formatter.zero_formats = [''] + formatter.formats[:-1]
    #...sauf pour les graduations qui sont principalement en heures, dans ce cas, il est agréable d'avoir
    ## le format jour-mois :
    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('Formateur de date concise')
plt.show()

Enregistrement d'un convertisseur avec localisation

Nous pouvons également enregistrer un convertisseur avec localisation en passant des arguments clés à ~.dates.ConciseDateConverter et en enregistrant les types de données que vous utiliserez avec le registre d'unités.

import datetime

formats = ['%y',          ## les graduations sont principalement en années
           '%b',     ## les graduations sont principalement en mois
           '%d',     ## les graduations sont principalement en jours
           '%H:%M',  ## heures
           '%H:%M',  ## minutes
           '%S.%f', ]  ## secondes
## ceux-ci peuvent être les mêmes, sauf décalés d'un niveau....
zero_formats = [''] + formats[:-1]
#...sauf pour les graduations qui sont principalement en heures, dans ce cas, il est agréable d'avoir le format jour-mois
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, layout='constrained', figsize=(6, 6))
for nn, ax in enumerate(axs):
    ax.plot(dates, y)
    ax.set_xlim(lims[nn])
axs[0].set_title('Formateur de date concise enregistré avec un format non par défaut')
plt.show()

Sommaire

Dans ce laboratoire, vous avez appris à utiliser le ~.dates.ConciseDateFormatter pour formater les graduations de date lors de l'utilisation de Matplotlib. Vous avez également appris à localiser les formats de date et à enregistrer des convertisseurs pour rendre le processus plus pratique.