Courbe avec bande d'erreur #

Cet exemple illustre comment tracer une bande d'erreur autour d'une courbe paramétrée.

Une courbe paramétrée x(t), y(t) peut être tracée directement à l'aide de 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)
bande d'erreur de courbe
[None]

Une bande d'erreur peut être utilisée pour indiquer l'incertitude de la courbe. Dans cet exemple, nous supposons que l'erreur peut être donnée sous la forme d'une erreur scalaire qui décrit l'incertitude perpendiculaire à la courbe en chaque point.

Nous visualisons cette erreur sous la forme d'une bande colorée autour du chemin à l'aide d'un PathPatch. Le patch est créé à partir de deux segments de chemin (xp, yp) et (xn, yn) qui sont décalés de +/- err perpendiculairement à la courbe (x, y) .

Remarque : Cette méthode d'utilisation de a PathPatchest adaptée aux courbes arbitraires en 2D. Si vous n'avez qu'un tracé y-vs.-x standard, vous pouvez utiliser la fill_betweenméthode la plus simple (voir aussi Remplir la zone entre les lignes ).

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()
erreur constante, erreur variable

Références

L'utilisation des fonctions, méthodes, classes et modules suivants est illustrée dans cet exemple :

Galerie générée par Sphinx-Gallery