Introducción
En este laboratorio, aprenderá a crear una cronología simple utilizando las fechas de lanzamiento de Matplotlib. Una cronología es una representación gráfica de una secuencia de eventos en orden cronológico. Las cronologías se pueden crear con una colección de fechas y texto. En este ejemplo, mostraremos cómo crear una cronología simple utilizando las fechas de los últimos lanzamientos de Matplotlib.
Consejos sobre la VM
Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.
A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.
Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.
Obtener datos
Para crear una cronología, necesitamos obtener datos como fechas y nombres. En este ejemplo, usaremos los lanzamientos de Matplotlib y sus fechas de GitHub. Si los datos no se pueden obtener por cualquier motivo, usaremos datos de respaldo como una copia de seguridad. Aquí está el código para obtener datos:
from datetime import datetime
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.dates as mdates
try:
## Intenta obtener una lista de los lanzamientos de Matplotlib y sus fechas
## desde 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'])
## Convierte cadenas de fechas (por ejemplo, 2014-10-18) a datetime
dates = [datetime.strptime(d, "%Y-%m-%d") for d in dates]
except Exception:
## En caso de que lo anterior falle, por ejemplo, debido a una conexión a Internet faltante
## use las siguientes listas como respaldo.
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']
## Convierte cadenas de fechas (por ejemplo, 2014-10-18) a datetime
dates = [datetime.strptime(d, "%Y-%m-%d") for d in dates]
Creando un diagrama de tallos
A continuación, crearemos un diagrama de tallos con algunas variaciones en los niveles para distinguir incluso eventos cercanos. Agregamos marcadores en la línea base para enfatizar visualmente la naturaleza unidimensional de la cronología. Para cada evento, agregamos una etiqueta de texto a través de ~.Axes.annotate, que está desplazada en unidades de puntos desde la punta de la línea del evento. Aquí está el código para crear un diagrama de tallos:
## Choose some nice levels
levels = np.tile([-5, 5, -3, 3, -1, 1],
int(np.ceil(len(dates)/6)))[:len(dates)]
## Create figure and plot a stem plot with the 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") ## The vertical stems.
ax.plot(dates, np.zeros_like(dates), "-o",
color="k", markerfacecolor="w") ## Baseline and markers on it.
## annotate lines
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")
Formateando la gráfica
Ahora, formatearemos la gráfica agregando etiquetas para los ejes x e y, configurando el localizador y formateador principales del eje x, y eliminando el eje y y las espinas. Aquí está el código para formatear la gráfica:
## 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()
Combinando todo
Aquí está el código final para crear una cronología simple utilizando las fechas de lanzamiento de Matplotlib:
from datetime import datetime
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.dates as mdates
try:
## Intenta obtener una lista de los lanzamientos de Matplotlib y sus fechas
## desde 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'])
## Convierte cadenas de fechas (por ejemplo, 2014-10-18) a datetime
dates = [datetime.strptime(d, "%Y-%m-%d") for d in dates]
except Exception:
## En caso de que lo anterior falle, por ejemplo, debido a una conexión a Internet faltante
## use las siguientes listas como respaldo.
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']
## Convierte cadenas de fechas (por ejemplo, 2014-10-18) a datetime
dates = [datetime.strptime(d, "%Y-%m-%d") for d in dates]
## Choose some nice levels
levels = np.tile([-5, 5, -3, 3, -1, 1],
int(np.ceil(len(dates)/6)))[:len(dates)]
## Create figure and plot a stem plot with the 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") ## The vertical stems.
ax.plot(dates, np.zeros_like(dates), "-o",
color="k", markerfacecolor="w") ## Baseline and markers on it.
## annotate lines
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()
Resumen
En este laboratorio, has aprendido cómo crear una cronología simple utilizando las fechas de lanzamiento de Matplotlib. Has aprendido cómo obtener datos, crear un diagrama de tallos, formatear la gráfica y combinar todo. Las cronologías se pueden utilizar para visualizar cualquier secuencia de eventos en orden cronológico.