Traccia yerr / xerr come area ombreggiata anziché come barre di errore


Risposte:


151

Ignorando l'interpolazione regolare tra i punti nel grafico di esempio (che richiederebbe una certa interpolazione manuale o semplicemente una risoluzione più elevata dei dati), è possibile utilizzare pyplot.fill_between():

from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(0, 30, 30)
y = np.sin(x/6*np.pi)
error = np.random.normal(0.1, 0.02, size=y.shape)
y += np.random.normal(0, 0.1, size=y.shape)

plt.plot(x, y, 'k-')
plt.fill_between(x, y-error, y+error)
plt.show()

inserisci qui la descrizione dell'immagine

Vedi anche gli esempi matplotlib .


1
Perfetto. Sì, non intendevo includere un esempio con linee smussate.
Austin Richardson,

Qualche idea su come rendere questo show ombreggiato invece di una fascia ombreggiata? Il mio primo istinto è stato quello di abusare lwma sembra non usare le stesse unità degli assi.
Benjamin Bannier,

@BenjaminBannier Non sono del tutto sicuro di cosa intendi. Sembra che tu voglia disegnare una casella in ogni punto, la sua altezza è uguale a quella della barra degli errori, mentre la larghezza dovrebbe essere tale da connettere (toccare) le caselle vicine. È corretto?

1
@EL_DON Vuoi dire che vorresti una leggenda con una linea nera + una banda blu e il testo sarebbe simile a "dati + 1 area di errore sigma"?

1
@Allan se le uniche barre di errore che hai sono orizzontali, probabilmente dovresti capovolgere gli assi del tuo problema reale (e quindi anche la figura). Normalmente, la variabile indipendente è quella senza (o con barre di errore molto piccole). Potresti essere in grado di imbrogliare, scambiando le tue variabili di dati e in matplotlib, scambiando anche gli assi.

131

Questa è sostanzialmente la stessa risposta fornita da Evert , ma estesa per mostrare alcune fantastiche opzioni difill_between

inserisci qui la descrizione dell'immagine

from matplotlib import pyplot as pl
import numpy as np

pl.clf()
pl.hold(1)

x = np.linspace(0, 30, 100)
y = np.sin(x) * 0.5
pl.plot(x, y, '-k')


x = np.linspace(0, 30, 30)
y = np.sin(x/6*np.pi)
error = np.random.normal(0.1, 0.02, size=y.shape) +.1
y += np.random.normal(0, 0.1, size=y.shape)

pl.plot(x, y, 'k', color='#CC4F1B')
pl.fill_between(x, y-error, y+error,
    alpha=0.5, edgecolor='#CC4F1B', facecolor='#FF9848')

y = np.cos(x/6*np.pi)    
error = np.random.rand(len(y)) * 0.5
y += np.random.normal(0, 0.1, size=y.shape)
pl.plot(x, y, 'k', color='#1B2ACC')
pl.fill_between(x, y-error, y+error,
    alpha=0.2, edgecolor='#1B2ACC', facecolor='#089FFF',
    linewidth=4, linestyle='dashdot', antialiased=True)



y = np.cos(x/6*np.pi)  + np.sin(x/3*np.pi)  
error = np.random.rand(len(y)) * 0.5
y += np.random.normal(0, 0.1, size=y.shape)
pl.plot(x, y, 'k', color='#3F7F4C')
pl.fill_between(x, y-error, y+error,
    alpha=1, edgecolor='#3F7F4C', facecolor='#7EFF99',
    linewidth=0)



pl.show()

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.