Dibujar una curva con banda de error

Beginner

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

Introducción

Este tutorial te guiará sobre cómo dibujar una curva con una banda de error utilizando Python Matplotlib. Una banda de error se utiliza para indicar la incertidumbre de la curva. En este ejemplo, asumimos que el error puede ser dado como un escalar err que describe la incertidumbre perpendicular a la curva en cada punto. Visualizamos este error como una banda coloreada alrededor de la trayectoria utilizando un .PathPatch. El parche se crea a partir de dos segmentos de trayectoria (xp, yp) y (xn, yn) que se desplazan por +/- err perpendicular a la curva (x, y).

Consejos sobre la VM

Una vez finalizada la inicialización de 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 puede automatizarse 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 las bibliotecas necesarias

El primer paso es importar las bibliotecas necesarias. Vamos a utilizar Matplotlib, NumPy, PathPatch y Path.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import PathPatch
from matplotlib.path import Path

Definir la curva

A continuación, definimos la curva alrededor de la cual queremos dibujar la banda de error. En este ejemplo, utilizaremos una curva paramétrica. Una curva paramétrica x(t), y(t) se puede dibujar directamente utilizando ~.Axes.plot.

N = 400
t = np.linspace(0, 2 * np.pi, N)
r = 0.5 + np.cos(t)
x, y = r * np.cos(t), r * np.sin(t)

Definir la banda de error

Ahora definiremos la banda de error que queremos dibujar alrededor de la curva. En este ejemplo, asumiremos que el error puede ser dado como un escalar err que describe la incertidumbre perpendicular a la curva en cada punto.

def draw_error_band(ax, x, y, err, **kwargs):
    ## Calculate normals via centered finite differences (except the first point
    ## which uses a forward difference and the last point which uses a backward
    ## difference).
    dx = np.concatenate([[x[1] - x[0]], x[2:] - x[:-2], [x[-1] - x[-2]]])
    dy = np.concatenate([[y[1] - y[0]], y[2:] - y[:-2], [y[-1] - y[-2]]])
    l = np.hypot(dx, dy)
    nx = dy / l
    ny = -dx / l

    ## end points of errors
    xp = x + nx * err
    yp = y + ny * err
    xn = x - nx * err
    yn = y - ny * err

    vertices = np.block([[xp, xn[::-1]],
                         [yp, yn[::-1]]]).T
    codes = np.full(len(vertices), Path.LINETO)
    codes[0] = codes[len(xp)] = Path.MOVETO
    path = Path(vertices, codes)
    ax.add_patch(PathPatch(path, **kwargs))

Dibujar la banda de error

Ahora podemos dibujar la banda de error llamando a la función draw_error_band y pasando los parámetros adecuados.

fig, axs = plt.subplots(1, 2, layout='constrained', sharex=True, sharey=True)
errs = [
    (axs[0], "error constante", 0.05),
    (axs[1], "error variable", 0.05 * np.sin(2 * t) ** 2 + 0.04),
]
for i, (ax, title, err) in enumerate(errs):
    ax.set(title=title, aspect=1, xticks=[], yticks=[])
    ax.plot(x, y, "k")
    draw_error_band(ax, x, y, err=err,
                    facecolor=f"C{i}", edgecolor="none", alpha=.3)

plt.show()

Ver la banda de error

La banda de error ahora debería ser visible alrededor de la curva.

Resumen

En este tutorial, hemos aprendido cómo dibujar una curva con una banda de error utilizando Python Matplotlib. Comenzamos importando las bibliotecas necesarias, definiendo la curva, definiendo la banda de error, dibujando la banda de error y viendo la banda de error.