2016-09-09 31 views
5

100 puanla sıralanmış bir points vektörüne sahibim. Şimdi iki histogram oluşturmak istiyorum: İlk histogramın eşit genişliğe sahip 10 bidon olması gerekir. İkincisi ayrıca 10 histograma sahip olmalı, ancak mutlaka eşit genişlikte olmamalıdır. İkincisi, histogramın her kutuda aynı sayıya sahip olmasını istiyorum. Örneğin, ilk çubuk çok kısa ve geniş olabilir, histogramdaki ikinci çubuk çok uzun ve dar olabilir. matplotlib kullanarak ilk histogramı oluşturan kodum var, ancak şimdi ikinci olanı oluşturma konusunda nasıl emin olacağımı bilmiyorum.Her bir bölmede eşit sayıda noktaya sahip Histogram

import matplotlib.pyplot as plt 
points = [1,2,3,4,5,6, ..., 99] 
n, bins, patches = plt.hist(points, 10) 

Düzenleme:

çözüm aşağıda çalışılıyor, biraz benim histogramda barlar tüm yükseklikleri aynıdır neden olarak şaşkın değilim.

enter image description here

+0

, tüm barlar yüksekliği aynıdır, histogramın tanımına göre). Aynı şeyi söyleyen kabul edilen yanıt düzenlemesine bakın. –

cevap

4

Bu (sıralanır noktaları Resim) Soru similar to one olduğunu, bir süre sonra bir cevap yazdım, ama kendi sorusunu garanti etmek için yeterince farklı. Çözüm ortaya çıkıyor, temelde aynı kodu diğer cevabımdan kullanıyor. tanım olarak --- Histogram her ambarda noktalarının sayısını belirtir, çünkü ---

def histedges_equalN(x, nbin): 
    npt = len(x) 
    return np.interp(np.linspace(0, npt, nbin + 1), 
        np.arange(npt), 
        np.sort(x)) 

x = np.random.randn(100) 
n, bins, patches = plt.hist(x, histedges_equalN(x, 10)) 

Bu çözelti, eşit yükseklikte kutusu ile bir histogram verir. Bir pdf (yani yoğunluk işlevi) almak için, normed=True kwg'yi plt.hist için kullanın. Benim other answer'da açıklandığı gibi.

+0

Çözümünüzü kullanmayı denedim, ancak nedense tüm kutularımın yüksekliği aynı. Bunun neden olduğunu biliyor musun? Onların kesinlikle farklı olmasını beklerdim, değil mi? Sorumlu bir resim eklemek için düzenledim. – Apollo

0

histogram için depo sağlar:

bins=points[0::len(points)/10]

ve

n, bins, patches = plt.hist(points, bins=bins)

+0

Bu neredeyse işe yarar, ancak adım kesin değilse; son kutu kaçırılacak. Bu durumda, onu eklemeniz yeterli olmaz çünkü elemanların sayısı mutlaka devam etmeyecektir. Örneğin, 100 öğeniz varsa ve 12 bidon istiyorsanız 8 adımlık bir adımınız olacak ve 100 öğenin yalnızca 97'sini hesaba katacaksınız.Son noktayı "bölmeler" e eklerseniz, bu bölme yalnızca 3 öğe içerir. – Shawn

0

Burada, sonucu nasıl alacağınıza dair bir örnek yazdım. Benim yaklaşımım, histogramı oluşturmak için np.histogram'a aktarılacak kutuları almak için veri noktalarını kullanır. Bu nedenle np.argsort(x) kullanarak verileri sıralama ihtiyacı. Kutu başına nokta sayısı npoints ile kontrol edilebilir. Örnek olarak, bu yöntemi kullanarak iki histogram yapıyorum. Tüm noktaların ağırlıklarının aynı olduğu bir nokta, böylece histogramın yüksekliği her zaman sabittir (ve npoints'a eşittir). Her bir noktanın "ağırlığının", tekdüze bir rastgele dağılımdan çekildiği diğer (bakınız mass dizisi). Beklendiği gibi, histogramın kutuları artık eşit değil. Ancak, bin başına Poisson hatası aynıdır. her bin aynı puanı ihtiva etmesi durumunda bir bar yüksekliği bu bölmeye ait nokta sayısı (çünkü

x = np.random.rand(1000) 
mass = np.random.rand(1000) 
npoints = 200 
ksort = np.argsort(x) 

#Here I get the bins from the data set. 
#Note that data need to be sorted 
bins=x[ksort[0::npoints]] 
bins=np.append(bins,x[ksort[-1]]) 


fig = plt.figure(1,figsize=(10,5)) 
ax1 = fig.add_subplot(121) 
ax2 = fig.add_subplot(122) 

#Histogram where each data 
yhist, xhist = np.histogram(x, bins, weights=None) 
ax1.plot(0.5*(xhist[1:]+xhist[:-1]), yhist, linestyle='steps-mid', lw=2, color='k') 

yhist, xhist = np.histogram(x, bins, weights=mass) 
ax2.plot(0.5*(xhist[1:]+xhist[:-1]), yhist, linestyle='steps-mid', lw=2, color='k') 

ax1.set_xlabel('x', size=15) 
ax1.set_ylabel('Number of points per bin', size=15) 

ax2.set_xlabel('x', size=15) 
ax2.set_ylabel('Mass per bin', size=15) 
Elbette

enter image description here