Plot yerr / xerr sebagai wilayah yang diarsir daripada bilah kesalahan

Jawaban:

151

Mengabaikan interpolasi yang mulus antara titik-titik dalam grafik contoh Anda (yang akan membutuhkan melakukan interpolasi manual, atau hanya memiliki resolusi data yang lebih tinggi), Anda dapat menggunakan 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()

masukkan deskripsi gambar di sini

Lihat juga contoh matplotlib .

Gabriel
sumber
1
Sempurna. Ya saya tidak bermaksud memasukkan contoh dengan garis yang dihaluskan.
Austin Richardson
Adakah yang tahu bagaimana membuat acara ini menaungi kotak alih-alih pita berbayang? Naluri pertamaku adalah menyalahgunakan lwtetapi tampaknya tidak menggunakan satuan yang sama dengan sumbu.
Benjamin Bannier
@BenjaminBannier Saya tidak sepenuhnya yakin maksud Anda. Kedengarannya seperti Anda ingin kotak yang digambar di setiap titik, tingginya sama dengan kotak kesalahan, sedangkan lebarnya harus sedemikian sehingga mereka menghubungkan (menyentuh) kotak yang berdekatan. Apakah itu benar?
1
@EL_DON Maksud Anda ingin legenda dengan garis hitam + pita biru, dan teksnya akan seperti "data + 1 sigma error region"?
1
@ Allan jika satu-satunya bar kesalahan yang Anda miliki adalah horisontal, Anda mungkin harus membalik sumbu dari masalah Anda yang sebenarnya (dan dengan demikian angka juga) Biasanya, variabel independen adalah yang tanpa bar kesalahan (atau dengan sangat kecil). Anda mungkin bisa menipu, dengan menukar variabel data Anda, dan di matplotlib, tukar sumbu juga.
131

Ini pada dasarnya adalah jawaban yang sama yang diberikan oleh Evert , tetapi diperluas untuk memamerkan beberapa opsi keren darifill_between

masukkan deskripsi gambar di sini

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
sumber
1
Solusi yang sedikit lebih baik: stackoverflow.com/questions/43064524/…
Shital Shah