使用matplotlib设置上下限
我想要绘制一些数据点,并加上误差条。
不过,有些数据点只有上限或下限,而不是完整的误差条。
所以我试着用索引来区分那些有误差条的点和只有上下限的点。
但是,当我尝试这样做的时候:
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 个回答
如果你一次只画一个点的误差条,@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)
其实,关于errorbar这个东西,有一点让我挺烦的,就是它对输入的形状和维度要求特别严格。
我猜你想要的是“误差条”,但是希望它们的位置是由绝对的上下限来决定,而不是通过一个对称的“误差”值。
errorbar的工作原理是把你的y数组和yerr[0](下限)一起捆绑起来(用safezip),而yerr[1]则是上限。所以你的y
和yerr[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) )
如果我理解错了什么,请告诉我。如果你能提供一些你使用的数据示例,那就更好了。