2017-03-24 40 views
5

Sürekli verilerden önceden tanımlanmış aralıklara ayrılmış bir çubuk grafiği oluşturmanın bir yolu var mı? Örneğin, Pandalar çubuk arsa, aralıklı aralıklarla

In[1]: df 
Out[1]: 
0  0.729630 
1  0.699620 
2  0.710526 
3  0.000000 
4  0.831325 
5  0.945312 
6  0.665428 
7  0.871845 
8  0.848148 
9  0.262500 
10  0.694030 
11  0.503759 
12  0.985437 
13  0.576271 
14  0.819742 
15  0.957627 
16  0.814394 
17  0.944649 
18  0.911111 
19  0.113333 
20  0.585821 
21  0.930131 
22  0.347222 
23  0.000000 
24  0.987805 
25  0.950570 
26  0.341317 
27  0.192771 
28  0.320988 
29  0.513834 

231 0.342541 
232 0.866279 
233 0.900000 
234 0.615385 
235 0.880597 
236 0.620690 
237 0.984375 
238 0.171429 
239 0.792683 
240 0.344828 
241 0.288889 
242 0.961686 
243 0.094402 
244 0.960526 
245 1.000000 
246 0.166667 
247 0.373494 
248 0.000000 
249 0.839416 
250 0.862745 
251 0.589873 
252 0.983871 
253 0.751938 
254 0.000000 
255 0.594937 
256 0.259615 
257 0.459916 
258 0.935065 
259 0.969231 
260 0.755814 

ve bunun yerine basit bir histogramın

:

df.hist() 

usual histogram of df

ben her çubuk, önceden tanımlanmış bir aralık içinde birçok durumu sayar bar arsa, oluşturmanız gerekir . [0 0.35], [0.35 0.7] [0,7 1,0]

DÜZENLEME cevaplar için

çok teşekkür ederiz: Örneğin, aşağıdaki arsa düşmek noktalarının sayısı ile üç bar olmalıdır. Başka bir soru, kutu sipariş nasıl? Gördüğünüz gibi

In[349]: out.value_counts() 
Out[349]: 
[0, 0.001]  104 
(0.001, 0.1]  61 
(0.1, 0.2]  32 
(0.2, 0.3]  20 
(0.3, 0.4]  18 
(0.7, 0.8]  6 
(0.4, 0.5]  6 
(0.5, 0.6]  5 
(0.6, 0.7]  4 
(0.9, 1]   3 
(0.8, 0.9]  2 
(1, 1.001]  0 

, son üç kutuları sipariş değildir: Örneğin, ben şu sonuç elde. Veri çerçevesini 'kategoriler' veya kutularım temelinde nasıl sıralayabilirim?

DÜZENLEME 2

Sadece basit 'reindex()' ile, bunu çözmek için nasıl bulundu:

In[355]: out.value_counts().reindex(out.cat.categories) 
Out[355]: 
[0, 0.001]  104 
(0.001, 0.1]  61 
(0.1, 0.2]  32 
(0.2, 0.3]  20 
(0.3, 0.4]  18 
(0.4, 0.5]  6 
(0.5, 0.6]  5 
(0.6, 0.7]  4 
(0.7, 0.8]  6 
(0.8, 0.9]  2 
(0.9, 1]   3 
(1, 1.001]  0 

cevap

7

Her aralığına karşılık gelen bidonları içine değerlerini bölüm için pd.cut yararlanabilir ve sonra pd.value_counts kullanarak her bir aralığın toplam sayısını al. Daha sonra bir çubuk grafik çizin, ek olarak X-ekseni kene etiketlerini, o işaretin ait olduğu kategori adıyla değiştirin. enter image description here


Eğer Y ekseni istiyorsanız

out = pd.cut(s, bins=[0, 0.35, 0.7, 1], include_lowest=True) 
ax = out.value_counts(sort=False).plot.bar(rot=0, color="b", figsize=(6,4)) 
ax.set_xticklabels([c[1:-1].replace(","," to") for c in out.cat.categories]) 
plt.show() 

frekans sayılarını normalleştirmek ve 100.

out = pd.cut(s, bins=[0, 0.35, 0.7, 1], include_lowest=True) 
out_norm = out.value_counts(sort=False, normalize=True).mul(100) 
ax = out_norm.plot.bar(rot=0, color="b", figsize=(6,4)) 
ax.set_xticklabels([c[1:-1].replace(","," to") for c in out.cat.categories]) 
plt.ylabel("pct") 
plt.show() 

enter image description here

o sonucu çarpın, nispi yüzde olarak görüntülenecek
+0

ve ben arsa normalleştirmek gerekirse? (dikey eksen yüzdesel olmalı ve frekans değil.) 'normed = True' in .hist() –

+0

@ArnoldKlein: Yazımı güncelledim –

+0

TypeError: 'pandas._libs.interval.Kütük etiketlerini değiştirmeye çalışırken Interval 'nesnesi abonelik değildir – famargar

2

pd.cut

'u kullanabilirsiniz.
bins = [0,0.35,0.7,1] 
df = df.groupby(pd.cut(df['val'], bins=bins)).val.count() 
df.plot(kind='bar') 

enter image description here

2

histogramı çizmek için matplotlib kullanmayı düşünebilirsiniz. Pandaların 'hist işlevinin aksine, matplotlib.pyplot.hist, kutular için giriş olarak bir dizi kabul eder.

import numpy as np; np.random.seed(0) 
import matplotlib.pyplot as plt 
import pandas as pd 

x = np.random.rand(120) 
df = pd.DataFrame({"x":x}) 

bins= [0,0.35,0.7,1] 
plt.hist(df.values, bins=bins, edgecolor="k") 
plt.xticks(bins) 

plt.show() 

enter image description here

İlgili konular