Création de visualisations de chronologie avec Matplotlib

PythonPythonBeginner
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

Dans ce laboratoire, vous allez apprendre à créer une chronologie simple à l'aide des dates de publication de Matplotlib. Une chronologie est une représentation graphique d'une séquence d'événements dans l'ordre chronologique. Les chronologies peuvent être créées avec une collection de dates et de texte. Dans cet exemple, nous allons montrer comment créer une chronologie simple à l'aide des dates des dernières publications de Matplotlib.

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 de notes pour accéder au carnet Jupyter pour pratiquer.

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

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églerons rapidement le problème pour vous.

Récupération des données

Pour créer une chronologie, nous devons récupérer des données telles que des dates et des noms. Dans cet exemple, nous utiliserons les publications de Matplotlib et leurs dates issues de GitHub. Si les données ne peuvent pas être récupérées pour quelque raison que ce soit, nous utiliserons des données de secours en tant que sauvegarde. Voici le code pour récupérer les données :

from datetime import datetime

import matplotlib.pyplot as plt
import numpy as np

import matplotlib.dates as mdates

try:
    ## Essayez de récupérer une liste des publications de Matplotlib et de leurs dates
    ## à partir de https://api.github.com/repos/matplotlib/matplotlib/releases
    import json
    import urllib.request

    url = 'https://api.github.com/repos/matplotlib/matplotlib/releases'
    url += '?per_page=100'
    data = json.loads(urllib.request.urlopen(url, timeout=1).read().decode())

    dates = []
    names = []
    for item in data:
        if 'rc' not in item['tag_name'] and 'b' not in item['tag_name']:
            dates.append(item['published_at'].split("T")[0])
            names.append(item['tag_name'])
    ## Convertissez les chaînes de dates (par exemple 2014-10-18) en datetime
    dates = [datetime.strptime(d, "%Y-%m-%d") for d in dates]

except Exception:
    ## En cas d'échec de la procédure ci-dessus, par exemple en raison d'un manque de connexion Internet
    ## utilisez les listes suivantes en tant que données de secours.
    names = ['v2.2.4', 'v3.0.3', 'v3.0.2', 'v3.0.1', 'v3.0.0', 'v2.2.3',
             'v2.2.2', 'v2.2.1', 'v2.2.0', 'v2.1.2', 'v2.1.1', 'v2.1.0',
             'v2.0.2', 'v2.0.1', 'v2.0.0', 'v1.5.3', 'v1.5.2', 'v1.5.1',
             'v1.5.0', 'v1.4.3', 'v1.4.2', 'v1.4.1', 'v1.4.0']

    dates = ['2019-02-26', '2019-02-26', '2018-11-10', '2018-11-10',
             '2018-09-18', '2018-08-10', '2018-03-17', '2018-03-16',
             '2018-03-06', '2018-01-18', '2017-12-10', '2017-10-07',
             '2017-05-10', '2017-05-02', '2017-01-17', '2016-09-09',
             '2016-07-03', '2016-01-10', '2015-10-29', '2015-02-16',
             '2014-10-26', '2014-10-18', '2014-08-26']

    ## Convertissez les chaînes de dates (par exemple 2014-10-18) en datetime
    dates = [datetime.strptime(d, "%Y-%m-%d") for d in dates]

Création d'un diagramme en tiges

Ensuite, nous allons créer un diagramme en tiges avec quelques variations de niveau pour distinguer même des événements proches. Nous ajoutons des marqueurs sur la ligne de base pour souligner visuellement la nature unidimensionnelle de la chronologie. Pour chaque événement, nous ajoutons une étiquette de texte via ~.Axes.annotate, qui est décalée en points à partir de la pointe de la ligne de l'événement. Voici le code pour créer un diagramme en tiges :

## Choisissez quelques niveaux agréables
levels = np.tile([-5, 5, -3, 3, -1, 1],
                 int(np.ceil(len(dates)/6)))[:len(dates)]

## Créez une figure et tracez un diagramme en tiges avec la date
fig, ax = plt.subplots(figsize=(8.8, 4), layout="constrained")
ax.set(title="Matplotlib release dates")

ax.vlines(dates, 0, levels, color="tab:red")  ## Les tiges verticales.
ax.plot(dates, np.zeros_like(dates), "-o",
        color="k", markerfacecolor="w")  ## La ligne de base et les marqueurs dessus.

## annoter les lignes
for d, l, r in zip(dates, levels, names):
    ax.annotate(r, xy=(d, l),
                xytext=(-3, np.sign(l)*3), textcoords="offset points",
                horizontalalignment="right",
                verticalalignment="bottom" if l > 0 else "top")

Formatage du tracé

Maintenant, nous allons formater le tracé en ajoutant des étiquettes pour l'axe des x et l'axe des y, en configurant le localisateur et le formateur principaux de l'axe des x, et en supprimant l'axe des y et les épines. Voici le code pour formater le tracé :

## format x-axis with 4-month intervals
ax.xaxis.set_major_locator(mdates.MonthLocator(interval=4))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%b %Y"))
plt.setp(ax.get_xticklabels(), rotation=30, ha="right")

## remove y-axis and spines
ax.yaxis.set_visible(False)
ax.spines[["left", "top", "right"]].set_visible(False)

ax.margins(y=0.1)
plt.show()

Mettre tout ça ensemble

Voici le code final pour créer une chronologie simple à l'aide des dates de publication de Matplotlib :

from datetime import datetime

import matplotlib.pyplot as plt
import numpy as np

import matplotlib.dates as mdates

try:
    ## Essayez de récupérer une liste des publications de Matplotlib et de leurs dates
    ## à partir de https://api.github.com/repos/matplotlib/matplotlib/releases
    import json
    import urllib.request

    url = 'https://api.github.com/repos/matplotlib/matplotlib/releases'
    url += '?per_page=100'
    data = json.loads(urllib.request.urlopen(url, timeout=1).read().decode())

    dates = []
    names = []
    for item in data:
        if 'rc' not in item['tag_name'] and 'b' not in item['tag_name']:
            dates.append(item['published_at'].split("T")[0])
            names.append(item['tag_name'])
    ## Convertissez les chaînes de dates (par exemple 2014-10-18) en datetime
    dates = [datetime.strptime(d, "%Y-%m-%d") for d in dates]

except Exception:
    ## En cas d'échec de la procédure ci-dessus, par exemple en raison d'un manque de connexion Internet
    ## utilisez les listes suivantes en tant que données de secours.
    names = ['v2.2.4', 'v3.0.3', 'v3.0.2', 'v3.0.1', 'v3.0.0', 'v2.2.3',
             'v2.2.2', 'v2.2.1', 'v2.2.0', 'v2.1.2', 'v2.1.1', 'v2.1.0',
             'v2.0.2', 'v2.0.1', 'v2.0.0', 'v1.5.3', 'v1.5.2', 'v1.5.1',
             'v1.5.0', 'v1.4.3', 'v1.4.2', 'v1.4.1', 'v1.4.0']

    dates = ['2019-02-26', '2019-02-26', '2018-11-10', '2018-11-10',
             '2018-09-18', '2018-08-10', '2018-03-17', '2018-03-16',
             '2018-03-06', '2018-01-18', '2017-12-10', '2017-10-07',
             '2017-05-10', '2017-05-02', '2017-01-17', '2016-09-09',
             '2016-07-03', '2016-01-10', '2015-10-29', '2015-02-16',
             '2014-10-26', '2014-10-18', '2014-08-26']

    ## Convertissez les chaînes de dates (par exemple 2014-10-18) en datetime
    dates = [datetime.strptime(d, "%Y-%m-%d") for d in dates]

## Choisissez quelques niveaux agréables
levels = np.tile([-5, 5, -3, 3, -1, 1],
                 int(np.ceil(len(dates)/6)))[:len(dates)]

## Créez une figure et tracez un diagramme en tiges avec la date
fig, ax = plt.subplots(figsize=(8.8, 4), layout="constrained")
ax.set(title="Matplotlib release dates")

ax.vlines(dates, 0, levels, color="tab:red")  ## Les tiges verticales.
ax.plot(dates, np.zeros_like(dates), "-o",
        color="k", markerfacecolor="w")  ## La ligne de base et les marqueurs dessus.

## annoter les lignes
for d, l, r in zip(dates, levels, names):
    ax.annotate(r, xy=(d, l),
                xytext=(-3, np.sign(l)*3), textcoords="offset points",
                horizontalalignment="right",
                verticalalignment="bottom" if l > 0 else "top")

## format x-axis with 4-month intervals
ax.xaxis.set_major_locator(mdates.MonthLocator(interval=4))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%b %Y"))
plt.setp(ax.get_xticklabels(), rotation=30, ha="right")

## remove y-axis and spines
ax.yaxis.set_visible(False)
ax.spines[["left", "top", "right"]].set_visible(False)

ax.margins(y=0.1)
plt.show()

Sommaire

Dans ce laboratoire, vous avez appris à créer une chronologie simple à l'aide des dates de publication de Matplotlib. Vous avez appris à récupérer des données, à créer un diagramme en tiges, à formater le tracé et à tout mettre ensemble. Les chronologies peuvent être utilisées pour visualiser n'importe quelle séquence d'événements dans l'ordre chronologique.