Introducción
Esta práctica te guiará sobre cómo interactuar con datos en múltiples lienzos. Al seleccionar y resaltar un punto en un eje, se generarán los datos de ese punto en el otro eje. Para esta práctica, usaremos Python Matplotlib.
Consejos sobre la VM
Una vez que se haya iniciado la VM, haz 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 tengas que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.
Si tienes problemas durante el aprendizaje, no dudes en preguntar a Labby. Proporciona retroalimentación después de la sesión y resolveremos rápidamente el problema para ti.
Importar bibliotecas
Comenzaremos importando las bibliotecas necesarias.
import numpy as np
import matplotlib.pyplot as plt
Generar datos
Generaremos datos aleatorios utilizando NumPy.
np.random.seed(19680801)
X = np.random.rand(100, 200)
xs = np.mean(X, axis=1)
ys = np.std(X, axis=1)
Crear figura y ejes
Crearemos una figura con dos ejes.
fig, (ax, ax2) = plt.subplots(2, 1)
Graficar datos
Graficaremos los datos generados en el primer eje.
line, = ax.plot(xs, ys, 'o', picker=True, pickradius=5)
Crear clase para el navegador de puntos
Crearemos una clase para manejar la funcionalidad del navegador de puntos.
class PointBrowser:
def __init__(self):
self.lastind = 0
self.text = ax.text(0.05, 0.95, 'selected: none',
transform=ax.transAxes, va='top')
self.selected, = ax.plot([xs[0]], [ys[0]], 'o', ms=12, alpha=0.4,
color='yellow', visible=False)
def on_press(self, event):
if self.lastind is None:
return
if event.key not in ('n', 'p'):
return
if event.key == 'n':
inc = 1
else:
inc = -1
self.lastind += inc
self.lastind = np.clip(self.lastind, 0, len(xs) - 1)
self.update()
def on_pick(self, event):
if event.artist!= line:
return True
N = len(event.ind)
if not N:
return True
## las ubicaciones del clic
x = event.mouseevent.xdata
y = event.mouseevent.ydata
distancias = np.hypot(x - xs[event.ind], y - ys[event.ind])
indmin = distancias.argmin()
dataind = event.ind[indmin]
self.lastind = dataind
self.update()
def update(self):
if self.lastind is None:
return
dataind = self.lastind
ax2.clear()
ax2.plot(X[dataind])
ax2.text(0.05, 0.9, f'mu={xs[dataind]:1.3f}\nsigma={ys[dataind]:1.3f}',
transform=ax2.transAxes, va='top')
ax2.set_ylim(-0.5, 1.5)
self.selected.set_visible(True)
self.selected.set_data(xs[dataind], ys[dataind])
self.text.set_text('selected: %d' % dataind)
fig.canvas.draw()
Conectar manejadores de eventos
Conectaremos los manejadores de eventos al lienzo de la figura.
browser = PointBrowser()
fig.canvas.mpl_connect('pick_event', browser.on_pick)
fig.canvas.mpl_connect('key_press_event', browser.on_press)
Mostrar la gráfica
Mostraremos la gráfica.
plt.show()
Resumen
En este laboratorio, aprendimos cómo interactuar con datos en múltiples lienzos utilizando Python Matplotlib. Creamos una clase para manejar la funcionalidad del navegador de puntos y conectamos los manejadores de eventos al lienzo de la figura para habilitar la interactividad.