Постройте yerr / xerr как заштрихованную область, а не планки ошибок

142

Как в matplotlib отображать ошибку как заштрихованную область, а не как полосы ошибок?

Например:

введите описание изображения здесь

скорее, чем

введите описание изображения здесь

Остин Ричардсон
источник
1
Как был создан главный сюжет?
MichaelSB

Ответы:

151

Игнорируя плавную интерполяцию между точками в вашем примере графика (для этого потребуется выполнить некоторую ручную интерполяцию или просто иметь более высокое разрешение ваших данных), вы можете использовать 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()

введите описание изображения здесь

См. Также примеры matplotlib .

Габриель
источник
1
Отлично. Да, я не хотел включать пример со сглаженными линиями.
Остин Ричардсон
Есть идеи, как сделать это шоу закрашенными коробками вместо затененной полосы? Моим первым побуждением было оскорбить, lwно, похоже, он не использовал те же единицы, что и топоры.
Бенджамин Банье,
@BenjaminBannier Я не совсем понимаю, что вы имеете в виду. Похоже, вы хотите нарисовать прямоугольник в каждой точке, его высота такая же, как у полосы ошибок, а ширина должна быть такой, чтобы они соединяли (касались) соседние прямоугольники. Это правильно?
1
@EL_DON Вы имеете в виду, что вам нужна легенда с черной линией + синей полосой, а текст будет выглядеть примерно так: "данные + 1 область ошибки сигмы"?
1
@Allan, если у вас есть только горизонтальные полосы ошибок, вам, вероятно, следует перевернуть оси вашей реальной проблемы (и, следовательно, цифру). Обычно независимая переменная - это переменная без (или с очень маленькими) полосами погрешностей. Вы можете обмануть, поменяв местами свои переменные данных, а в matplotlib также поменять местами оси.
131

Это в основном тот же ответ, что и Evert , но расширенный, чтобы продемонстрировать некоторые интересные вариантыfill_between

введите описание изображения здесь

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()
Борис Горелик
источник
1
Чуть лучшее решение: stackoverflow.com/questions/43064524/…
Шитал Шах