2010-10-05 15 views
56

में 1 से योग है I matplotlib का उपयोग कर वेक्टर से सामान्यीकृत हिस्टोग्राम प्लॉट करना चाहूंगा।हिस्टोग्राम प्लॉटिंग जिनकी बार ऊंचाई matplotlib

plt.hist(myarray, normed=True) 

के साथ-साथ: मैं निम्नलिखित की कोशिश की

plt.hist(myarray, normed=1) 

लेकिन न तो विकल्प से y- अक्ष का उत्पादन [0, 1] ऐसी है कि करने के लिए 1. मैं हिस्टोग्राम राशि का बार ऊंचाइयों इस तरह के हिस्टोग्राम का उत्पादन करना पसंद है - मैं इसे कैसे कर सकता हूं?

धन्यवाद!

+1

मैं जानता हूँ कि यह पुराना है, लेकिन भविष्य में संदर्भ और जो कोई भी इस पृष्ठ पर जाता है के लिए, अक्ष प्रसार के इस प्रकार कहा जाता है एक "संभाव्यता घनत्व" धुरी! – ChristineB

+0

ओपी यदि आप अभी भी आसपास हैं तो आप स्वीकार किए गए उत्तर को बदलना चाहते हैं। –

उत्तर

39

यदि आप अधिक पूर्ण कार्य (या इस मामले में गैर-काम करने वाले) उदाहरण को देखते हैं तो यह अधिक उपयोगी होगा।

import numpy as np 
import matplotlib.pyplot as plt 

x = np.random.randn(1000) 

fig = plt.figure() 
ax = fig.add_subplot(111) 
n, bins, rectangles = ax.hist(x, 50, normed=True) 
fig.canvas.draw() 
plt.show() 

यह वास्तव में एक y- अक्ष कि [0,1] से चला जाता है के साथ एक बार-चार्ट हिस्टोग्राम उत्पादन करेगा:

मैं निम्नलिखित की कोशिश की।

इसके अलावा, के रूप में प्रति hist प्रलेखन (यानी ipython से ax.hist?), मुझे लगता है कि योग भी ठीक है:

np.sum(n * np.diff(bins)) 

मैं:

*normed*: 
If *True*, the first element of the return tuple will 
be the counts normalized to form a probability density, i.e., 
``n/(len(x)*dbin)``. In a probability density, the integral of 
the histogram should be 1; you can verify that with a 
trapezoidal integration of the probability density function:: 

    pdf, bins, patches = ax.hist(...) 
    print np.sum(pdf * np.diff(bins)) 

ऊपर बताए गए आदेशों के बाद एक कोशिश इस देते अपेक्षित के रूप में 1.0 का वापसी मूल्य प्राप्त करें। याद रखें कि normed=True का मतलब यह नहीं है कि प्रत्येक बार में मान का योग एकता होगा, लेकिन सलाखों के अभिन्न अंग की बजाय एकता है। मेरे मामले में np.sum(n) लगभग 7.2767 लौटा।

13

मुझे पता है कि यह प्रश्न 2010 के प्रश्न पर विचार करने में बहुत देर हो चुकी है, लेकिन मैं इस सवाल पर आया क्योंकि मुझे एक जैसी समस्या का सामना करना पड़ रहा था। जैसा कि पहले से ही उत्तर में बताया गया है, मानकीकृत = सही मतलब है कि हिस्टोग्राम के तहत कुल क्षेत्र 1 के बराबर है लेकिन ऊंचाई की योग 1 के बराबर नहीं है। हालांकि, मैं चाहता हूं कि हिस्टोग्राम की भौतिक व्याख्या की सुविधा के लिए, एक बनाओ 1.

के बराबर हाइट्स की राशि के साथ मैं निम्नलिखित प्रश्न में एक संकेत मिला - Python: Histogram with area normalized to something other than 1

लेकिन मैं सलाखों histtype = "कदम" सुविधा hist की नकल करने का एक तरीका खोजने के लिए सक्षम नहीं था()। इससे मुझे बदल दिया गया: Matplotlib - Stepped histogram with already binned data

यदि समुदाय इसे स्वीकार्य पाता है तो मुझे एक समाधान देना चाहिए जो उपर्युक्त पदों से विचारों को संश्लेषित करता है।

import matplotlib.pyplot as plt 

# Let X be the array whose histogram needs to be plotted. 
nx, xbins, ptchs = plt.hist(X, bins=20) 
plt.clf() # Get rid of this histogram since not the one we want. 

nx_frac = nx/float(len(nx)) # Each bin divided by total number of objects. 
width = xbins[1] - xbins[0] # Width of each bin. 
x = np.ravel(zip(xbins[:-1], xbins[:-1]+width)) 
y = np.ravel(zip(nx_frac,nx_frac)) 

plt.plot(x,y,linestyle="dashed",label="MyLabel") 
#... Further formatting. 

यह हालांकि कुछ मामलों मैंने देखा है में मेरे लिए अद्भुत काम किया है कि छोड़ दिया सबसे "बार" या सही सबसे हिस्टोग्राम की "बार" Y- के निम्नतम बिंदु को छूने से नीचे बंद नहीं होती है एक्सिस। ऐसे मामले में भिक्षा पर तत्व 0 जोड़ना या वाई के अंत में आवश्यक परिणाम प्राप्त हुआ।

बस सोचा कि मैं अपना अनुभव साझा करूंगा। धन्यवाद।

+0

मुझे लगता है कि आपको plt.hist में भी मानक = सही की आवश्यकता है। पायथन 3 में भी आपको सूची का उपयोग करना होगा (ज़िप (...))। –

146

आप सभी सलाखों की राशि बराबर एकता, वजन मूल्यों की कुल संख्या से प्रत्येक बिन होना चाहते हैं:

weights = np.ones_like(myarray)/float(len(myarray)) 
plt.hist(myarray, weights=weights) 

आशा है कि, में मदद करता है, हालांकि धागा काफी पुराना है ...

+8

ग्रेट उत्तर। ध्यान दें कि अगर मायरे एक अंजीर सरणी के बजाय एक अजगर 'array_like' है, तो आपको 'len (myarray)' 'float' पर डालना होगा। – cmh

+0

यदि मयरेरे बहुआयामी है और आप केवल एक आयाम का उपयोग कर रहे हैं, जैसे कि मयरे [0 ,:], तो आप np.size (myarray [0 ,:]) के साथ लेन (myarray) को स्वैप कर सकते हैं और यह काम करेगा उसी तरह। (अन्यथा, यह कहता है कि वस्तु कॉल करने योग्य नहीं है।) – ChristineB

8

np.histogram() विधि का उपयोग कर एक और आसान समाधान है।

myarray = np.random.random(100) 
results, edges = np.histogram(myarray, normed=True) 
binWidth = edges[1] - edges[0] 
plt.bar(edges[:-1], results*binWidth, binWidth) 

आप वास्तव में देख सकते हैं कि के साथ कुल रकम अप करने के लिए 1:

> print sum(results*binWidth) 
1.0 
संबंधित मुद्दे