使用matplotlib设置上下限

10 投票
2 回答
22787 浏览
提问于 2025-04-17 20:14

我想要绘制一些数据点,并加上误差条。

不过,有些数据点只有上限或下限,而不是完整的误差条。

所以我试着用索引来区分那些有误差条的点和只有上下限的点。

但是,当我尝试这样做的时候:

errorbar(x[i], y[i], yerr = (ymin[i], ymax[i]))

我收到了一个错误:

ValueError: In safezip, len(args[0])=1 but len(args[1])=2

这和这里的讨论有点像 这里,不过我不使用pandas,虽然能多了解一些相关内容对我来说会很有帮助。

无论如何,我尝试用以下方式来“解决”这个错误:

errorbar(x[i], y[i], yerr = [[ymin[i], ymax[i]]], uplims = True)

但是结果出来的图不太清晰:看起来上限和误差条一起被绘制了,或者上限被绘制了两次……

我的目标是当上下误差条不对称时,绘制上下限,这样我就可以选择箭头前的条的长度来表示上下限。

2 个回答

0

如果你一次只画一个点的误差条,@cge 的精彩回答只能帮你到这里。考虑一下,

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1,2,3,4])
y = np.array([1,2,3,4])  
ymin = np.array([0,1,2,3])
ymax = np.array([3,4,5,6])
ytop = ymax-y
ybot = y-ymin

# This did not work for me
plt.errorbar(x, y, yerr=(ybot, ytop) )

会出现错误

ValueError: The lengths of the data (1) and the error 2 do not match

要解决这个问题,你需要把误差条的数组进行转置,这样它就会被理解为 (2,N=1),而不是错误的 (1,N=2),具体可以参考

https://matplotlib.org/stable/gallery/statistics/errorbar_features.html

对我来说,这意味着要设置

yerrs = np.atleast_2d([ybot,ytop]).T

然后简单地调用

plt.errorbar(x, y, yerr=yerrs)
16

其实,关于errorbar这个东西,有一点让我挺烦的,就是它对输入的形状和维度要求特别严格。

我猜你想要的是“误差条”,但是希望它们的位置是由绝对的上下限来决定,而不是通过一个对称的“误差”值。

errorbar的工作原理是把你的y数组和yerr[0](下限)一起捆绑起来(用safezip),而yerr[1]则是上限。所以你的yyerr[0](还有yerr[1])应该是大小、形状和维度都一样的数组。其实yerr本身根本不需要是数组。

你提供的第一段代码是可以工作的,前提是x、y、ymin和ymax都是一维数组,这正是它们应该是的。听起来你的y不是一维的。

不过,需要注意的是,因为errorbar的yerr是误差量,而不是绝对的限制,所以你需要把y加上和减去你的实际上下限。

举个例子:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1,2,3,4])
y = np.array([1,2,3,4])  
ymin = np.array([0,1,2,3])
ymax = np.array([3,4,5,6])
ytop = ymax-y
ybot = y-ymin

# This works
plt.errorbar(x, y, yerr=(ybot, ytop) )

enter image description here

如果我理解错了什么,请告诉我。如果你能提供一些你使用的数据示例,那就更好了。

撰写回答