将散点数据转化为带标准差误差条的分箱数据
我有一堆散落的 x 和 y 数据。如果我想根据 x 的值把这些数据分组,并在每组上加上标准差的误差条,我该怎么做呢?
我知道在 Python 中可以通过循环遍历 x 数据,把它们分到不同的组里(分组的大小是 (最大值(X) - 最小值(X)) / 组数),然后再对这些组进行循环,计算标准差。不过,我相信用 numpy 还有更快的方法可以做到这一点。
我希望最终的效果能和这个链接里的“垂直对称”效果类似:http://matplotlib.org/examples/pylab_examples/errorbar_demo.html
2 个回答
0
没有循环!Python让你尽量避免使用循环。
我不太确定我理解得对不对,你是不是有一个相同的x向量对应所有的数据,还有很多不同的y向量对应不同的测量?然后你想把这些数据画出来,显示每个x的y值的平均值和标准差作为误差条,对吧?
这样的话就简单了。我假设你有一个长度为M的x向量,还有一个N*M的数组,里面存的是N组y数据,这些数据已经加载到变量x和y里面了。
import numpy as np
import pyplot as pl
error = np.std(y,axis=1)
ymean = np.mean(y,axis=1)
pl.errorbar(x,ymean,error)
pl.show()
希望这对你有帮助。如果你有任何问题或者不明白的地方,随时告诉我。
22
你可以使用 np.histogram
来对你的数据进行分箱处理。我正在重用来自 另一个回答 的代码,以计算分箱后 y
的平均值和标准差:
import numpy as np
import matplotlib.pyplot as plt
x = np.random.rand(100)
y = np.sin(2*np.pi*x) + 2 * x * (np.random.rand(100)-0.5)
nbins = 10
n, _ = np.histogram(x, bins=nbins)
sy, _ = np.histogram(x, bins=nbins, weights=y)
sy2, _ = np.histogram(x, bins=nbins, weights=y*y)
mean = sy / n
std = np.sqrt(sy2/n - mean*mean)
plt.plot(x, y, 'bo')
plt.errorbar((_[1:] + _[:-1])/2, mean, yerr=std, fmt='r-')
plt.show()