Постройте 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/…
— Шитал Шах
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.