6

我有一堆数据分散在x,y。如果我想根据 x 对这些进行分类并在它们上放置等于标准偏差的误差线,我将如何去做呢?

我在 python 中唯一知道的是循环 x 中的数据并根据 bin (max(X)-min(X)/nbins) 对它们进行分组,然后遍历这些块以找到 std。我确信使用 numpy 有更快的方法来做到这一点。

我希望它看起来类似于“垂直对称”: http: //matplotlib.org/examples/pylab_examples/errorbar_demo.html

4

2 回答 2

21

您可以使用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()

在此处输入图像描述

于 2013-03-21T22:48:32.833 回答
0

没有循环!Python 允许您尽可能避免循环。

我不确定得到所有东西,所有数据都有相同的 x 向量和对应于不同测量值的许多 y 向量吗?并且您想将您的数据绘制为“垂直对称”,其中每个 x 的 y 平均值和每个 x 的标准偏差作为误差线?

然后很容易。我假设你有一个 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()

我希望它有所帮助。如果您有任何问题或不清楚,请告诉我。

于 2013-03-21T21:04:23.307 回答