2013-03-21 59 views
3

我有一堆數據分散在x,y中。如果我想根據x來分解這些數據,並將誤差線條與標準偏差相等,那我該怎麼做呢?將散點數據轉換爲裝箱數據,誤差線等於標準差

我唯一知道的python是遍歷x中的數據並根據bin(max(X)-min(X)/ nbins)將它們分組,然後遍歷這些塊來找到std。我敢肯定有更快的方式與numpy做這個。

我希望它在類似於 「VERT對稱」:http://matplotlib.org/examples/pylab_examples/errorbar_demo.html

回答

10

您可以將您的數據與np.histogram聯繫起來。我是從this other answer重用代碼來計算裝箱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() 

enter image description here

0

沒有循環! Python允許你儘可能地避免循環。

我不確定要得到所有的東西,對於所有的數據和對應於不同的測量的許多y向量都有相同的x向量no?你想繪製你的數據爲「vert symmetric」,每個x的平均值爲y​​,每個x的標準偏差爲一個誤差棒?

然後很簡單。我假設你有一個M-long x向量和你的N組y數據已經裝載在變量名x和y中的N * M數組。

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() 

我希望它有幫助。如果您有任何問題或不清楚,請告訴我。

+0

y是隻是長度爲N的列矢量,並且x是長度N.這的列向量不會收集數據。 – Griff 2013-03-21 21:19:35

+0

我得到numpy std kwarg軸= 1意味着std被列爲明智的。你能解釋一下dim-1列表或數組是如何工作的嗎? – mikey 2017-10-26 18:26:51

+0

@mikey:我的回答是作者提到的話題。因爲沒有標記爲1的軸,所以將kwarg軸= 1與1維數組一起使用會導致IndexError。 – 2017-10-30 09:08:41