Curva con banda di errore #

Questo esempio illustra come disegnare una banda di errore attorno a una curva parametrizzata.

Una curva parametrizzata x(t), y(t) può essere disegnata direttamente 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 di errore della curva
[None]

Una banda di errore può essere utilizzata per indicare l'incertezza della curva. In questo esempio assumiamo che l'errore possa essere dato come uno scalare err che descrive l'incertezza perpendicolare alla curva in ogni punto.

Visualizziamo questo errore come una banda colorata attorno al percorso utilizzando un'estensione PathPatch. La patch viene creata da due segmenti di percorso (xp, yp) e (xn, yn) che vengono spostati di +/- err perpendicolarmente alla curva (x, y) .

Nota: questo metodo di utilizzo di a PathPatchè adatto a curve arbitrarie in 2D. Se hai solo un grafico standard y-vs.-x, puoi usare il fill_betweenmetodo più semplice (vedi anche Riempire l'area tra le linee ).

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()
errore costante, errore variabile

Riferimenti

L'uso delle seguenti funzioni, metodi, classi e moduli è mostrato in questo esempio:

Galleria generata da Sphinx-Gallery