Curva con banda de error #

Este ejemplo ilustra cómo dibujar una banda de error alrededor de una curva parametrizada.

Una curva parametrizada x(t), y(t) se puede dibujar directamente usando plot.

import numpy as np

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

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)

fig, ax = plt.subplots()
ax.plot(x, y, "k")
ax.set(aspect=1)
banda de error de curva
[None]

Se puede utilizar una banda de error para indicar la incertidumbre de la curva. En este ejemplo asumimos que el error se puede dar como un error escalar que describe la incertidumbre perpendicular a la curva en cada punto.

Visualizamos este error como una banda de color alrededor de la ruta usando un archivo PathPatch. El parche se crea a partir de dos segmentos de ruta (xp, yp) y (xn, yn) que se desplazan +/- err perpendicularmente a la curva (x, y) .

Nota: Este método de usar a PathPatches adecuado para curvas arbitrarias en 2D. Si solo tiene una gráfica estándar de y-vs.-x, puede usar el fill_betweenmétodo más simple (vea también Llenar el área entre líneas ).

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))


axs = (plt.figure(constrained_layout=True)
       .subplots(1, 2, sharex=True, sharey=True))
errs = [
    (axs[0], "constant error", 0.05),
    (axs[1], "variable error", 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()
error constante, error variable

Referencias

En este ejemplo se muestra el uso de las siguientes funciones, métodos, clases y módulos:

Galería generada por Sphinx-Gallery