Curva com banda de erro #

Este exemplo ilustra como desenhar uma faixa de erro ao redor de uma curva parametrizada.

Uma curva parametrizada x(t), y(t) pode ser desenhada diretamente 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 erro de curva
[None]

Uma banda de erro pode ser usada para indicar a incerteza da curva. Neste exemplo, assumimos que o erro pode ser dado como um erro escalar que descreve a incerteza perpendicular à curva em cada ponto.

Visualizamos esse erro como uma faixa colorida ao redor do caminho usando um arquivo PathPatch. O patch é criado a partir de dois segmentos de caminho (xp, yp) , e (xn, yn) que são deslocados por +/- err perpendicular à curva (x, y) .

Nota: Este método de usar a PathPatché adequado para curvas arbitrárias em 2D. Se você tiver apenas um gráfico y-vs.-x padrão, poderá usar o fill_betweenmétodo mais simples (consulte também Preenchendo a área entre as linhas ).

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()
erro constante, erro variável

Referências

O uso das seguintes funções, métodos, classes e módulos é mostrado neste exemplo:

Galeria gerada por Sphinx-Gallery