2017-03-24 11 views
5

क्या पूर्वनिर्धारित अंतराल में बने निरंतर डेटा से बार प्लॉट बनाने का कोई तरीका है? उदाहरण के लिए,बिनस रेंज के साथ पांडस बार प्लॉट

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 

और एक सरल हिस्टोग्राम के बजाय:

df.hist() 

usual histogram of df

मैं एक बार साजिश है, जहां प्रत्येक बार एक पूर्वनिर्धारित सीमा के भीतर उदाहरणों की एक संख्या की गणना होती है बनाने की जरूरत । [0 0.35], [0.35 0.7] [0.7 1.0]

संपादित

अपने जवाब के लिए बहुत धन्यवाद: उदाहरण के लिए, निम्नलिखित साजिश जो में गिर अंकों की संख्या के साथ तीन बार होना चाहिए। एक और सवाल, डिब्बे कैसे ऑर्डर करें?

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 

के रूप में आप देख सकते हैं, पिछले तीन डिब्बे का आदेश दिया नहीं कर रहे हैं: उदाहरण के लिए, मैं निम्नलिखित परिणाम मिलता है। 'श्रेणियों' या मेरे डिब्बे के आधार पर डेटा फ्रेम को कैसे सॉर्ट करें?

संपादित 2

बस इसे कैसे हल करने के लिए, बस 'अनुक्रमणः()' के साथ पाया:

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 

उत्तर

7

आप प्रत्येक अंतराल के लिए इसी डिब्बे में मूल्यों विभाजन pd.cut का उपयोग कर सकते और फिर pd.value_counts का उपयोग करके प्रत्येक अंतराल की कुल गणना करें। बाद में एक बार ग्राफ प्लॉट करें, अतिरिक्त रूप से X-axis टिक लेबल को श्रेणी के नाम से प्रतिस्थापित करें, जिसमें वह विशेष टिक संबंधित है।

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

enter image description here


आप Y- अक्ष चाहते हैं रिश्तेदार प्रतिशत के रूप में प्रदर्शित करने के लिए, आवृत्ति की गिनती सामान्य और 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

साथ कि परिणाम गुणा
+0

और मैं साजिश को सामान्य बनाने की जरूरत है? (ऊर्ध्वाधर धुरी प्रतिशत होना चाहिए और आवृत्ति नहीं। .hist() –

+0

@ अर्नोल्डक्लेन: मैंने अपनी पोस्ट अपडेट की है। –

+0

मुझे टाइप एरर मिलता है: 'pandas._libs.interval।टिक लेबल – famargar

2

आप पीडी.cut

का उपयोग कर सकते हैं
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

आप हिस्टोग्राम साजिश matplotlib उपयोग करने पर विचार कर सकते हैं। पांडा के विपरीत 'hist फ़ंक्शन, matplotlib.pyplot.hist डिब्बे के लिए इनपुट के रूप में एक सरणी स्वीकार करता है।

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

संबंधित मुद्दे