matplotlib 错误条连续线图

1 投票
1 回答
3158 浏览
提问于 2025-04-17 19:58

我遇到了一个有趣的问题,涉及到使用matplotlib绘制误差条。我有两个列表:

一个是“iterations”,它是一个从0到999的整数列表;另一个是“average”,它是一个大小为1000的列表,里面全是负数。

如果我不指定“yerr”这个属性,我得到的是:

errorbar(iterations,average)

img1

但是,如果我指定了yerr属性,并且设置为0,我得到的是:

errorbar(iterations,average,yerr=0)

img2

我觉得这两张图应该是一样的,但第二张图是由小的水平线组成,而第一张图看起来是连续的。

问题出现在我传递一个数组作为yerr(大小为1000,所有值都设置为0,除了在某些真实的标准误差值的地方,索引%50==0,以免图像过于拥挤)。

errorbar(iterations,average,yerr=stderr)

我希望得到一张主线是连续的图(像第一张),但结果却是一张杂乱的图,像第二张。我尝试了很多方法,比如修改线条样式的参数,但我仍然得到类似于第一张的效果(每隔50步就有误差条)。

我是不是做错了什么?我想要的效果可能实现吗?

更新 1

正如David在评论中所说,水平线出现是因为标准误差为0的默认形状。我原以为0的值表示没有误差条。所以我只需要避免在我设置为0的地方绘制误差条(误差条只在50、100、150、200、250... 1000的位置)。

更新 2(已解决)

在这里添加David提出的解决方案:

# plot all points without error bars
plot(iterations, average)
# plot errorbars for every 50th point
errorbar(iterations[::50], average[::50], yerr=stderr[::50], linestyle='None')

我只是添加了linestyle='None',以避免在每个yerr条之间绘制线。

非常感谢!

1 个回答

0

好吧,你想要误差条,结果也得到了。相反,如果你在参数列表中不指定 yerr,那么误差条的文档上说“如果 yerr 不是 None,就会绘制垂直误差条”。

我不太明白为什么要使用 errorbar 并且把 yerr=0,但是 yerr=0 的误差条会显示为小的水平线,因为这个误差条的样式是没有垂直延伸的。

如果你想表示多个数据点的误差,最好是用一个阴影背景来表示误差区域。你可以用fill_between 函数来实现这个效果。

编辑:根据评论中的更详细问题,绘图代码可以是

# plot all points without error bars
plot(iterations, average)
# plot errorbars for every 50th point
errorbar(iterations[::50], average[::50], yerr=error[::50])

撰写回答