Desenhar uma Curva com Faixa de Erro

Beginner

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

Introdução

Este tutorial irá guiá-lo sobre como desenhar uma curva com uma faixa de erro usando Python Matplotlib. Uma faixa de erro é usada para indicar a incerteza da curva. Neste exemplo, assumimos que o erro pode ser dado como um escalar err que descreve a incerteza perpendicular à curva em cada ponto. Visualizamos este erro como uma faixa colorida ao redor do caminho usando um .PathPatch. O patch é criado a partir de dois segmentos de caminho (xp, yp), e (xn, yn) que são deslocados por +/- err perpendicularmente à curva (x, y).

Dicas para a VM

Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook para acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.

Importar as Bibliotecas Necessárias

O primeiro passo é importar as bibliotecas necessárias. Usaremos Matplotlib, NumPy, PathPatch e Path.

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

Definir a Curva

Em seguida, definimos a curva em torno da qual queremos desenhar a faixa de erro. Neste exemplo, usaremos uma curva parametrizada. Uma curva parametrizada x(t), y(t) pode ser desenhada diretamente usando ~.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 a Faixa de Erro

Agora definiremos a faixa de erro que queremos desenhar em torno da curva. Neste exemplo, assumiremos que o erro pode ser dado como um escalar err que descreve a incerteza perpendicular à curva em cada ponto.

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

Desenhar a Faixa de Erro

Agora podemos desenhar a faixa de erro chamando a função draw_error_band e passando os parâmetros apropriados.

fig, axs = plt.subplots(1, 2, layout='constrained', 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()

Visualizar a Faixa de Erro

A faixa de erro agora deve estar visível em torno da curva.

Resumo

Neste tutorial, aprendemos como desenhar uma curva com uma faixa de erro usando Python Matplotlib. Começamos importando as bibliotecas necessárias, definindo a curva, definindo a faixa de erro, desenhando a faixa de erro e visualizando a faixa de erro.