Plotar yerr / xerr como região sombreada em vez de barras de erro

Respostas:

151

Ignorando a interpolação suave entre pontos em seu gráfico de exemplo (isso exigiria alguma interpolação manual ou apenas uma resolução mais alta dos seus dados), você pode 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()

insira a descrição da imagem aqui

Veja também os exemplos do matplotlib .

Gabriel
fonte
1
Perfeito. Sim, eu não pretendia incluir um exemplo com linhas suavizadas.
Austin Richardson
Alguma idéia de como fazer esse show com caixas sombreadas em vez de uma banda sombreada? Meu primeiro instinto foi abusar, lwmas parece não usar as mesmas unidades que os eixos.
Benjamin Bannier
@BenjaminBannier Não tenho muita certeza do que você quer dizer. Parece que você deseja desenhar uma caixa em cada ponto, sua altura é igual à da barra de erro, enquanto a largura deve ser tal que eles conectem (toquem) as caixas vizinhas. Isso está correto?
1
@EL_DON Você quer dizer uma lenda com uma linha preta + faixa azul, e o texto seria algo como "dados + 1 região de erro sigma"?
1
@ Allan Se as únicas barras de erro que você tem são horizontais, você provavelmente deve virar os eixos do seu problema real (e, portanto, a figura também). Normalmente, a variável independente é aquela sem (ou com barras muito pequenas) de erro. Você pode trapacear, trocando suas variáveis ​​de dados e, no matplotlib, também troque os eixos.
131

Esta é basicamente a mesma resposta fornecida por Evert , mas estendida para mostrar algumas opções interessantes defill_between

insira a descrição da imagem aqui

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
fonte
1
Solução um pouco melhor: stackoverflow.com/questions/43064524/…
Shital Shah