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.