2012-09-05 17 views
6

मैं matplotlib का उपयोग कर हिस्टोग्राम का हिस्सा खींचने की कोशिश कर रहा हूं।matplotlib मानदंड हिस्टोग्राम

पूरे हिस्टोग्राम को चित्रित करने के बजाय जिसमें बहुत से बाहरी और बड़े मूल्य हैं, मैं केवल एक छोटे से हिस्से पर ध्यान केंद्रित करना चाहता हूं। मूल हिस्टोग्राम इस तरह दिखता है:

hist(data, bins=arange(data.min(), data.max(), 1000), normed=1, cumulative=False) 
plt.ylabel("PDF") 

enter image description here

और ध्यान केंद्रित करने के बाद यह इस तरह दिखता है: और

hist(data, bins=arange(0, 121, 1), normed=1, cumulative=False) 
plt.ylabel("PDF") 

enter image description here

सूचना है कि पिछले बिन खींची जाती है सभी का सबसे बुरा वाई टिकों को स्केल किया जाता है ताकि योग बिल्कुल 1 हो (इसलिए वर्तमान सीमा से बाहर बिंदुओं को ध्यान में नहीं रखा जाता है)

मुझे पता है कि मैं पूरी संभव सीमा पर हिस्टोग्राम ड्राइंग करके और फिर अक्ष को उस हिस्से में प्रतिबंधित कर सकता हूं जिसमें मुझे दिलचस्पी है, लेकिन यह उस समय की गणना करने में बहुत समय बर्बाद कर देता है जो मैं नहीं करूँगा वैसे भी उपयोग/देखें।

hist(btsd-40, bins=arange(btsd.min(), btsd.max(), 1), normed=1, cumulative=False) 
axis([0,120,0,0.0025]) 

enter image description here

वहाँ एक तेज़ और आसान सिर्फ ध्यान केंद्रित क्षेत्र आकर्षित लेकिन अभी भी Y पैमाने सही पाने के लिए रास्ता नहीं है?

+0

कैसे normed मूल्यों को ध्यान में डेटा के पूरे सेट लेने के बिना गणना की जाएगी? सामान्य रूप से, हिस्टोग्राम मानों की गणना की जानी चाहिए ताकि वक्र का अभिन्न अंग 1 की संख्या से विभाजित न हो। – chthonicdaemon

+0

वितरण का वर्णन करने वाले फ़ंक्शन की अनुपस्थिति में आप जो कर सकते हैं, वह अंक की संख्या की गणना करता है और तदनुसार विभाजित होता है। – cdecker

उत्तर

5

हिस्टोग्राम का सबसेट प्लॉट करने के लिए, मुझे नहीं लगता कि आप पूरे हिस्टोग्राम की गणना करने के लिए चारों ओर जा सकते हैं।

क्या आपने numpy.histogram के साथ हिस्टोग्राम की गणना करने की कोशिश की है और फिर pylab.plot या कुछ का उपयोग कर एक क्षेत्र की साजिश रची है? अर्थात।

import numpy as np 
import pylab as plt 

data = np.random.normal(size=10000)*10000 

plt.figure(0) 
plt.hist(data, bins=np.arange(data.min(), data.max(), 1000)) 

plt.figure(1) 
hist1 = np.histogram(data, bins=np.arange(data.min(), data.max(), 1000)) 
plt.bar(hist1[1][:-1], hist1[0], width=1000) 

plt.figure(2) 
hist2 = np.histogram(data, bins=np.arange(data.min(), data.max(), 200)) 
mask = (hist2[1][:-1] < 20000) * (hist2[1][:-1] > 0) 
plt.bar(hist2[1][mask], hist2[0][mask], width=200) 

मूल हिस्टोग्राम: Original histogram

हिस्टोग्राम मैन्युअल गणना: Histogram calculated manually

हिस्टोग्राम मैन्युअल गणना, क्रॉप: Histogram calculated manually, cropped (एनबी: मान क्योंकि डिब्बे हैं छोटे होते हैं संकरा)

4

मुझे लगता है, आप दिए गए वजन का उपयोग करके अपने डेटा को सामान्य कर सकते हैं। (repeat एक numpy फ़ंक्शन है)।

hist(data, bins=arange(0, 121, 1), weights=repeat(1.0/len(data), len(data)))

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