Trace yerr / xerr como región sombreada en lugar de barras de error

Respuestas:

151

Ignorando la interpolación suave entre puntos en su gráfico de ejemplo (eso requeriría hacer una interpolación manual, o simplemente tener una resolución más alta de sus datos), puede usar 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()

ingrese la descripción de la imagen aquí

Véanse también los ejemplos de matplotlib .

Gabriel
fuente
1
Perfecto. Sí, no quise incluir un ejemplo con líneas suavizadas.
Austin Richardson
¿Alguna idea de cómo hacer que este espectáculo muestre cajas sombreadas en lugar de una banda sombreada? Mi primer instinto fue abusar, lwpero parece no usar las mismas unidades que los ejes.
Benjamin Bannier
@BenjaminBannier No estoy completamente seguro de lo que quieres decir. Suena como si quisiera dibujar un cuadro en cada punto, su altura es la misma que la de la barra de error, mientras que el ancho debe ser tal que conecten (toquen) los cuadros vecinos. ¿Es eso correcto?
1
@EL_DON ¿Quiere decir que le gustaría una leyenda con una línea negra + banda azul y el texto sería algo así como "datos + 1 región de error sigma"?
1
@Allan si las únicas barras de error que tienes son horizontales, probablemente deberías voltear los ejes de tu problema real (y, por lo tanto, también la figura). Normalmente, la variable independiente es la que no tiene (o con muy pequeñas) barras de error. Es posible que pueda hacer trampas, intercambiando sus variables de datos, y en matplotlib, también cambie los ejes.
131

Esta es básicamente la misma respuesta proporcionada por Evert , pero extendida para mostrar algunas opciones interesantes defill_between

ingrese la descripción de la imagen aquí

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()
Boris Gorelik
fuente
1
Solución ligeramente mejor: stackoverflow.com/questions/43064524/…
Shital Shah