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

3 minutos de lectura

avatar de usuario
austin richardson

En matplotlib, ¿cómo represento el error como una región sombreada en lugar de barras de error?

Por ejemplo:

ingrese la descripción de la imagen aquí

más bien que

ingrese la descripción de la imagen aquí

  • ¿Cómo se generó la trama superior?

    – MichaelSB

    6 de marzo de 2019 a las 21:26

  • ¿Responde esto a tu pregunta? Trazado de la región de incertidumbre sombreada en un gráfico de líneas en matplotlib cuando los datos tienen NaN

    – Reinderien

    18 de abril de 2020 a las 22:04

Ignorando la interpolación suave entre puntos en su gráfico de ejemplo (que requeriría hacer alguna 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éase también el ejemplos de matplotlib.

  • Perfecto. Sí, no quise incluir un ejemplo con líneas suavizadas.

    –Austin Richardson

    18/10/2012 a las 15:49

  • ¿Alguna idea de cómo hacer que esto muestre cuadros sombreados en lugar de una banda sombreada? Mi primer instinto fue abusar lw pero parece no usar las mismas unidades que los ejes.

    – Benjamín Banner

    27/08/2013 a las 20:30

  • @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?

    usuario707650

    28 de agosto de 2013 a las 9:13

  • @EL_DON ¿Quiere decir que le gustaría una leyenda con una línea negra + una banda azul, y el texto sería algo así como “región de error de datos + 1 sigma”?

    usuario707650

    26 de agosto de 2016 a las 6:27

  • @Allan, si las únicas barras de error que tiene son horizontales, probablemente debería voltear los ejes de su problema real (y, por lo tanto, también la figura). Normalmente, la variable independiente es la que no tiene (o tiene muy pequeñas) barras de error. Es posible que pueda hacer trampa intercambiando sus variables de datos y, en matplotlib, también intercambiando los ejes.

    usuario707650

    27 de abril de 2017 a las 7:40

avatar de usuario
Boris Gorelik

Esta es básicamente la misma respuesta proporcionada por Evert, pero ampliada para mostrar algunas opciones geniales de fill_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()

  • Solución ligeramente mejor: stackoverflow.com/questions/43064524/…

    – Shital Shah

    17 de abril de 2020 a las 9:11

¿Ha sido útil esta solución?