将yerr / xerr绘制为阴影区域而不是误差线


Answers:


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 sigma错误区域”?

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/...
清淳沙阿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.