2010-04-26 3 views
3

저는 쌍의 값을 포함하는 2 차원 배열을 가지고 있고 x 값의 다른 상자에 의해 y 값의 boxplot을 만들고 싶습니다. 나는. 어레이 인 경우 :matplotlib에서 binned boxplot을 numpy와 scipy with Python으로 만듭니다.

my_array = array([[1, 40.5], [4.5, 60], ...]]) 

다음 I가 빈 my_array 배열을 원하는 [:, 0] 다음 빈들의 각각에 대해, 해당 my_array가 박스 플롯을 생성 [:, 1]의 값 각각에 해당하는 상자. 그래서 결국은 줄거리가 많은 박스 플롯을 포함하고 싶습니다.

그러나
min_x = min(my_array[:, 0]) 
max_x = max(my_array[:, 1]) 

num_bins = 3 
bins = linspace(min_x, max_x, num_bins) 
elts_to_bins = digitize(my_array[:, 0], bins) 

,이 날 1 나는 내가 쓰레기통 0 기반 인덱스를 얻을해야한다고 생각 3. 범위 elts_to_bins에 가치를 제공하고, 나는 단지 3 개 쓰레기통을 원 :

나는 다음과 같은 시도 . 필자는 이것이 빈 공간에서 디지털 방식으로 표현되는 방식과 함게 약간의 까다로운 부분이 있다고 가정합니다.

가장 쉬운 방법은 무엇입니까? 나는 num_bins를 원한다. 첫 번째 bin은 데이터의 아래쪽 절반을 포함하고 upper bin은 상반부를 포함한다. ie, 나는 각 데이터 포인트가 어떤 bin에 들어가기를 원한다. boxplot.

감사합니다.

답변

4

NumPy와는 당신이 필요 히스토그램에게 길을 만들기위한 dedicated function있는 각 값을 a[i]은 (는) weights[i]에 기여할 것입니다. 예 : X = 1.

당신은 bins 인수, 빈들, 또는 빈의 제한 개수를 설정할 수

합니다 (official documentation 대한 참조에

a = [0, 1] 
weights = [10, 2] 

은 X = 0에서 10 점, 2 점을 설명 자세한 내용은).

히스토그램은 다음과 같이 플롯 할 수 있습니다

:

bar(bin_edges[:-1], hist_data) 

만, 유사한 hist() 기능을 직접 히스토그램 플롯 할 수 있습니다 히스토그램을 플롯을해야하는 경우 :

hist(my_array[:,0], weights=my_array[:,1]) 
+0

I을 왜 "가중치"가 문서를 읽은 후 여기서 사용되는지 이해할 수 없습니다. 설명해 주시겠습니까? 요점이 요소를 배지에 할당하는 것일 뿐인데, 왜 저울이 역할을해야하는지 알지 못합니다. – user248237dfsf

+0

나는 가중치 인자의 역할을보다 자세하게 설명 할 수 있도록 해답을 편집했다. 대답이 유용하다고 생각한다면 엄지 손가락을 올려주세요! :) – EOL

+1

사실, np.histogram은 불행히도 그가 필요로하는 것을하지 않을 것입니다. 그는 각 bin에 boxplot을 만들기 위해 각 bin에 속하는 실제 값이 필요합니다. (또는 그것이 내 잘못이라고 생각하면 어쨌든, 저를 수정했습니다!) weights 매개 변수는 각 가중치에 각 값을 곱하기 때문에 빈의 수에 1을 더하는 대신 가중치 [i] . 이는 하나의 배열을 다른 배열의 값으로 binning하는 것과는 다른 효과이며, 관계없이 각 bin에 속하는 배열의 하위 집합을 반환하지는 않습니다. (아니면 내가 완전히 오해하고있는 것일까 요?) –

6

배열의 최대 값에 대한 세 번째 저장소가 있습니다. 여기에 오타가 있다고 가정하고 max_x는 "max (my_array [:, 0])"대신 "max (my_array [:,1])"). 마지막 빈에 1 (또는 임의의 양수)을 추가하여이를 피할 수 있습니다.

또한 올바르게 이해한다면, 하나의 변수를 다른 변수로 비우기를 원하므로 아래 예제에서이를 나타냅니다. 재 배열을 사용하는 경우 (훨씬 느림) matplotlib.mlab에 여러 가지 기능이 있습니다 (예 : mlab.rec_groupby 등).

:

어쨌든, 결국, 당신은 빠른 예를 들어

def bin_by(x, y, nbins=30): 
    """ 
    Bin x by y. 
    Returns the binned "x" values and the left edges of the bins 
    """ 
    bins = np.linspace(y.min(), y.max(), nbins+1) 
    # To avoid extra bin for the max value 
    bins[-1] += 1 

    indicies = np.digitize(y, bins) 

    output = [] 
    for i in xrange(1, len(bins)): 
     output.append(x[indicies==i]) 

    # Just return the left edges of the bins 
    bins = bins[:-1] 

    return output, bins 

(x와 y가 같은 길이입니다 가정, Y의 값에 의해 빈 X에) 이런 일이있을 수 있습니다

In [3]: x = np.random.random((100, 2)) 

In [4]: binned_values, bins = bin_by(x[:,0], x[:,1], 2) 

In [5]: binned_values 
Out[5]: 
[array([ 0.59649575, 0.07082605, 0.7191498 , 0.4026375 , 0.06611863, 
     0.01473529, 0.45487203, 0.39942696, 0.02342408, 0.04669615, 
     0.58294003, 0.59510434, 0.76255006, 0.76685052, 0.26108928, 
     0.7640156 , 0.01771553, 0.38212975, 0.74417014, 0.38217517, 
     0.73909022, 0.21068663, 0.9103707 , 0.83556636, 0.34277006, 
     0.38007865, 0.18697416, 0.64370535, 0.68292336, 0.26142583, 
     0.50457354, 0.63071319, 0.87525221, 0.86509534, 0.96382375, 
     0.57556343, 0.55860405, 0.36392931, 0.93638048, 0.66889756, 
     0.46140831, 0.01675165, 0.15401495, 0.10813141, 0.03876953, 
     0.65967335, 0.86803192, 0.94835281, 0.44950182]), 
array([ 0.9249993 , 0.02682873, 0.89439141, 0.26415792, 0.42771144, 
     0.12292614, 0.44790357, 0.64692616, 0.14871052, 0.55611472, 
     0.72340179, 0.55335053, 0.07967047, 0.95725514, 0.49737279, 
     0.99213794, 0.7604765 , 0.56719713, 0.77828727, 0.77046566, 
     0.15060196, 0.39199123, 0.78904624, 0.59974575, 0.6965413 , 
     0.52664095, 0.28629324, 0.21838664, 0.47305751, 0.3544522 , 
     0.57704906, 0.1023201 , 0.76861237, 0.88862359, 0.29310836, 
     0.22079126, 0.84966201, 0.9376939 , 0.95449215, 0.10856864, 
     0.86655289, 0.57835533, 0.32831162, 0.1673871 , 0.55742108, 
     0.02436965, 0.45261232, 0.31552715, 0.56666458, 0.24757898, 
     0.8674747 ])] 

희망이 조금 있습니다! 당신처럼 사용할 수 있습니다

histogram(a, bins=10, range=None, normed=False, weights=None, new=None) 

: 여기

(hist_data, bin_edges) = histogram(my_array[:,0], weights=my_array[:,1]) 

중요한 점은 weights 인수를 사용하는 것입니다

관련 문제