以阴影区域而不是误差线的形式绘制yerr/xerr

204
在matplotlib中,如何将误差绘制为阴影区域而不是误差条?例如:

enter image description here

而不是

enter image description here


1
顶部的图是如何生成的? - MichaelSB
2个回答

211

忽略您示例图中点之间的平滑插值(这将需要进行一些手动插值,或仅使用更高分辨率的数据),您可以使用 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()

enter image description here

还可以参考matplotlib示例


1
完美的。是的,我并不打算包含具有平滑线条的示例。 - Austin Richardson
有想法如何使其显示阴影框而不是阴影带?我的第一反应是滥用 lw 但它似乎不使用与轴相同的单位。 - Benjamin Bannier
@BenjaminBannier 我不是完全确定你的意思。听起来好像你想在每个点上画一个框,它的高度与误差线的高度相同,而宽度应该足以连接(接触)相邻的框。是这样吗? - user707650
2
@EL_DON 您的意思是您想要一个带有黑线+蓝色带的图例,文本内容类似于“数据+1西格玛误差区域”? - user707650
1
@Allan 如果你只有水平误差线,那么你可能应该翻转你实际问题的轴(以及图形)。通常,自变量是没有(或非常小的)误差线的变量。你可以通过交换数据变量,并在matplotlib中交换轴来欺骗系统。 - user707650
显示剩余6条评论

160

这基本上是由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
稍微好一点的解决方案:https://dev59.com/J1gQ5IYBdhLWcg3wPxrb - Shital Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接