मैं एक हिस्टोग्राम कैसे कर सकता हूं जैसे कि मैटप्लोटलिब में 1 तक सलाखों की ऊंचाई?


85

मैं matplotlib का उपयोग करके वेक्टर से एक सामान्यीकृत हिस्टोग्राम की साजिश करना चाहता हूं। मैंने निम्नलिखित कोशिश की:

plt.hist(myarray, normed=True)

साथ ही साथ:

plt.hist(myarray, normed=1)

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


5
मुझे पता है कि यह पुराना है, लेकिन भविष्य के संदर्भ और इस पृष्ठ पर जाने वाले किसी भी व्यक्ति के लिए, इस तरह के अक्ष प्रसार को "संभावना घनत्व" अक्ष कहा जाता है!
क्रिस्टीन

जवाबों:


48

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

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

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, density=True)
fig.canvas.draw()
plt.show()

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

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

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

ऊपर दिए गए आदेशों के बाद इसे आज़माएं:

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

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


3
हां, यह एक संभावना घनत्व ग्राफ है, मुझे लगता है कि वह एक संभावना जन ग्राफ चाहता है।
NoName

200

यदि आप चाहते हैं कि सभी पट्टियों का योग समान हो, तो प्रत्येक बिन को मानों की कुल संख्या से घटाएँ:

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

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

पायथन 2.x के लिए ध्यान दें: float()विभाजन के किसी एक ऑपरेटर के लिए कास्टिंग जोड़ें अन्यथा आप पूर्णांक विभाजन के कारण शून्य के साथ समाप्त हो जाएंगे


8
बहुत बढ़िया जवाब। ध्यान दें कि अगर मायरे array_likeएक सुन्न सरणी के बजाय एक अजगर है तो आपको कास्ट len(myarray)करने की आवश्यकता होगी float
सेमी

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

22

मुझे पता है कि इस प्रश्न पर विचार करने में बहुत देर हो चुकी है क्योंकि प्रश्न दिनांक २०१० है, लेकिन मैं इस प्रश्न के सामने आया क्योंकि मैं स्वयं एक ऐसी समस्या का सामना कर रहा था। जैसा कि पहले ही उत्तर में कहा गया है, मानदंड = सत्य का अर्थ है कि हिस्टोग्राम के तहत कुल क्षेत्रफल 1 के बराबर है, लेकिन ऊंचाइयों का योग 1 के बराबर नहीं है। हालांकि, मैं एक हिस्टोग्राम की भौतिक व्याख्या की सुविधा के लिए, एक बनाना चाहता हूं 1 के बराबर ऊँचाई के योग के साथ।

मुझे निम्नलिखित प्रश्न में एक संकेत मिला - पायथन: 1 के अलावा किसी अन्य क्षेत्र के लिए हिस्टोग्राम सामान्य है

लेकिन मैं बार को हिस्टाइप = "स्टेप" फीचर हिस्ट () बनाने की नकल करने का तरीका नहीं ढूंढ पा रहा था। इसने मुझे डायवर्ट किया: माटप्लोटलिब - पहले से ही बंद डेटा के साथ हिस्टोग्राम

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

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 जोड़ने से आवश्यक परिणाम प्राप्त हुआ।

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


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

11

यहाँ 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.