डेटा की एक सूची के साथ पायथन में Matplotlib का उपयोग करके हिस्टोग्राम की साजिश कैसे करें?


98

मैं एक हिस्टोग्राम का उपयोग करने की कोशिश कर रहा हूँ matplotlib.hist() फ़ंक्शन लेकिन मुझे यह सुनिश्चित नहीं है कि यह कैसे करना है।

मेरे पास एक सूची है

probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]

और नामों की सूची (तार)।

मैं प्रत्येक बार के मेरे y- मूल्य और x- मान के रूप में नाम के रूप में संभावना कैसे बना सकता हूं?

जवाबों:


167

यदि आप हिस्टोग्राम चाहते हैं, तो आपको किसी भी 'नाम' को एक्स-वैल्यू में संलग्न करने की आवश्यकता नहीं है, जैसा कि एक्स-एक्सिस पर आपके पास डेटा पिन होगा:

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
np.random.seed(42)
x = np.random.normal(size=1000)
plt.hist(x, density=True, bins=30)  # `density=False` would make counts
plt.ylabel('Probability')
plt.xlabel('Data');

यहां छवि विवरण दर्ज करें

आप PDFलाइन, शीर्षक और किंवदंती के साथ अपने हिस्टोग्राम को थोड़ा कट्टर बना सकते हैं :

import scipy.stats as st
plt.hist(x, density=True, bins=30, label="Data")
mn, mx = plt.xlim()
plt.xlim(mn, mx)
kde_xs = np.linspace(mn, mx, 301)
kde = st.gaussian_kde(x)
plt.plot(kde_xs, kde.pdf(kde_xs), label="PDF")
plt.legend(loc="upper left")
plt.ylabel('Probability')
plt.xlabel('Data')
plt.title("Histogram");

यहां छवि विवरण दर्ज करें

हालाँकि, यदि आपके पास सीमित संख्या में डेटा पॉइंट्स हैं, जैसे ओपी में, एक बार प्लॉट आपके डेटा का प्रतिनिधित्व करने के लिए अधिक समझ में आता है (तब आप एक्स-एक्सिस पर लेबल संलग्न कर सकते हैं):

x = np.arange(3)
plt.bar(x, height=[1,2,3])
plt.xticks(x, ['a','b','c'])

यहां छवि विवरण दर्ज करें


4
याद रखें, अजगर में लाइनों के अंत में कोई अर्धविराम नहीं!
toad22222

10
@ Toad22222 यह Ipython नोटबुक सेल का एक अंश है। अर्धविराम के बिना इसे निष्पादित करने का प्रयास करें और अंतर देखें। सभी कोड स्निपेट I SO पर पोस्ट मेरे कंप्यूटर पर पूरी तरह से चलते हैं।
सर्गेई बुशमैनोव

2
यदि आप सर्गेई द्वारा उपयोग किए जाने वाले अर्ध-बृहदान्त्र के बारे में सोच रहे हैं, तो प्लॉट ऑब्जेक्ट के बारे में पाठ को दबाने की साजिश रचते समय जुपाइटर नोटबुक (पूर्व में आईपीथॉन नोटबुक) कोशिकाओं में अर्ध-बृहदान्त्र का उपयोग कैसे किया जाता है, इसके लिए यहां और # 16 देखें ।
वेन

19

यदि आपने अभी तक matplotlib स्थापित नहीं किया है तो केवल कमांड का प्रयास करें।

> pip install matplotlib

पुस्तकालय आयात

import matplotlib.pyplot as plot

हिस्टोग्राम डेटा:

plot.hist(weightList,density=1, bins=20) 
plot.axis([50, 110, 0, 0.06]) 
#axis([xmin,xmax,ymin,ymax])
plot.xlabel('Weight')
plot.ylabel('Probability')

हिस्टोग्राम प्रदर्शित करें

plot.show()

और उत्पादन की तरह है:

यहां छवि विवरण दर्ज करें


2
प्लॉट.एक्सिस ([50, 110, 0, 0.06]) 'लाइन उदाहरण के लिए बेकार है। इसके अलावा, जैसा कि यह दिखाने के लिए कथानक का क्षेत्र कठिन है, यदि आपका डेटा पूरी तरह से इसके अंदर फिट नहीं होता है तो आप भ्रमित हो सकते हैं कि यह सही तरीके से क्यों नहीं दिखाता है।
typhon04

8

हालांकि यह सवाल हिस्टोग्राम के इस्तेमाल की साजिश रचने के लिए प्रतीत होता है matplotlib.hist() फ़ंक्शन फ़ंक्शन करता है, लेकिन यह निश्चित रूप से उसी के उपयोग से नहीं किया जा सकता है जब प्रश्न के उत्तरार्द्ध को दी गई संभावनाओं का उपयोग बार के y-मान और दिए गए नामों (स्ट्रिंग्स) के रूप में किया जाता है। एक्स-मूल्यों।

मैं प्लॉट ड्रा करने के लिए दी गई संभावनाओं के अनुरूप नामों की एक नमूना सूची मान रहा हूं। एक साधारण बार प्लॉट दिए गए समस्या के लिए यहाँ उद्देश्य प्रदान करता है। निम्नलिखित कोड का उपयोग किया जा सकता है:

import matplotlib.pyplot as plt
probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]
names = ['name1', 'name2', 'name3', 'name4', 'name5', 'name6', 'name7', 'name8', 'name9',
'name10', 'name11', 'name12', 'name13'] #sample names
plt.bar(names, probability)
plt.xticks(names)
plt.yticks(probability) #This may be included or excluded as per need
plt.xlabel('Names')
plt.ylabel('Probability')

4

यह करने का एक बहुत ही गोल-गोल तरीका है, लेकिन यदि आप एक हिस्टोग्राम बनाना चाहते हैं, जहां आप पहले से ही बिन मूल्यों को जानते हैं, लेकिन स्रोत डेटा नहीं है, तो आप np.random.randintप्रत्येक की सीमा के भीतर मानों की सही संख्या उत्पन्न करने के लिए फ़ंक्शन का उपयोग कर सकते हैं। उदाहरण के लिए ग्राफ के लिए हिस्ट फंक्शन के लिए बिन:

import numpy as np
import matplotlib.pyplot as plt

data = [np.random.randint(0, 9, *desired y value*), np.random.randint(10, 19, *desired y value*), etc..]
plt.hist(data, histtype='stepfilled', bins=[0, 10, etc..])

लेबल के रूप में आप इस तरह से कुछ प्राप्त करने के लिए डिब्बे के साथ एक्स टिक को संरेखित कर सकते हैं:

#The following will align labels to the center of each bar with bin intervals of 10
plt.xticks([5, 15, etc.. ], ['Label 1', 'Label 2', etc.. ])

3

यह एक पुराना प्रश्न है, लेकिन पिछले उत्तरों में से किसी ने भी वास्तविक मुद्दे को संबोधित नहीं किया है, अर्थात यह तथ्य कि समस्या स्वयं प्रश्न के साथ है।

सबसे पहले, यदि संभावनाओं की पहले ही गणना की जा चुकी है, यानी हिस्टोग्राम एग्रीगेटेड डेटा सामान्य तरीके से उपलब्ध है, तो संभावनाओं को 1 तक जोड़ना चाहिए। वे स्पष्ट रूप से ऐसा नहीं करते हैं और इसका मतलब है कि यहां कुछ गलत है, या तो शब्दावली के साथ या डेटा के साथ। या जिस तरह से सवाल पूछा जाता है।

दूसरा, यह तथ्य है कि लेबल प्रदान किए जाते हैं (और अंतराल नहीं) सामान्य रूप से इसका मतलब होगा कि संभावनाएं श्रेणीबद्ध प्रतिक्रिया चर की हैं - और हिस्टोग्राम की साजिश रचने के लिए बार प्लॉट का उपयोग सबसे अच्छा है (या पाइलोट के हिस्ट विधि के कुछ हैकिंग), शायान शफीक का जवाब कोड प्रदान करता है।

हालाँकि, समस्या 1 देखें, वे संभावनाएँ सही नहीं हैं और इस मामले में बार प्लॉट का "हिस्टोग्राम" के रूप में उपयोग करना गलत होगा क्योंकि यह एकतरफा वितरण की कहानी नहीं बताता है, किसी कारण से (शायद कक्षाएं अतिव्यापी हैं और टिप्पणियों को कई गिना जाता है) बार?) और इस तरह के साजिश को इस मामले में हिस्टोग्राम नहीं कहा जाना चाहिए।

हिस्टोग्राम परिभाषा के अनुसार अविभाज्य चर के वितरण का चित्रमय प्रतिनिधित्व है (देखें https://www.itl.nist.gov/div898/handbook/eda/section3/histogra.htm , https://en.wikipedia.org/wiki / हिस्टोग्राम) और ब्याज के चर के चयनित वर्गों में अवलोकनों की संख्या या आवृत्तियों का प्रतिनिधित्व करने वाले आकारों के बार बनाकर बनाया जाता है। यदि चर को निरंतर पैमाने पर मापा जाता है तो वे वर्ग बिन (अंतराल) होते हैं। हिस्टोग्राम निर्माण प्रक्रिया का महत्वपूर्ण हिस्सा यह स्पष्ट कर रहा है कि किस प्रकार समूह (या समूह के बिना रखें) एक श्रेणीगत चर के लिए प्रतिक्रियाओं की श्रेणियां, या संभव मूल्यों के डोमेन को अंतराल में (जहां बिन सीमाएं डालते हैं) को कैसे विभाजित किया जाए परिवर्तनशील प्रकार। सभी टिप्पणियों का प्रतिनिधित्व किया जाना चाहिए, और हर एक को केवल एक बार भूखंड में। इसका मतलब है कि बार आकार का योग अवलोकन की कुल गणना के बराबर होना चाहिए (या चर चौड़ाई के मामले में उनके क्षेत्र, जो कम आम दृष्टिकोण है)। या, यदि हिस्टोग्राम सामान्यीकृत है, तो सभी संभावनाओं को 1 तक जोड़ना होगा।

यदि डेटा स्वयं एक प्रतिक्रिया के रूप में "संभाव्यता" की एक सूची है, अर्थात अवलोकन अध्ययन की प्रत्येक वस्तु के लिए संभाव्यता मान (किसी चीज़ के) हैं तो सबसे अच्छा जवाब बस plt.hist(probability)शायद बाइनिंग विकल्प के साथ है, और पहले से उपलब्ध एक्स-लेबल का उपयोग है। संदिग्ध।

तब बार प्लॉट को हिस्टोग्राम के रूप में नहीं बल्कि सीधे इस्तेमाल किया जाना चाहिए

import matplotlib.pyplot as plt
probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]
plt.hist(probability)
plt.show()

परिणामों के साथ

यहां छवि विवरण दर्ज करें

इस तरह के मामले में matplotlib निम्नलिखित हिस्टोग्राम मूल्यों के साथ डिफ़ॉल्ट रूप से आता है

(array([1., 1., 1., 1., 1., 2., 0., 2., 0., 4.]),
 array([0.31308411, 0.32380469, 0.33452526, 0.34524584, 0.35596641,
        0.36668698, 0.37740756, 0.38812813, 0.39884871, 0.40956928,
        0.42028986]),
 <a list of 10 Patch objects>)

परिणाम सरणियों का एक समूह है, पहले सरणी में अवलोकन मायने रखता है, अर्थात प्लॉट के y- अक्ष के खिलाफ क्या दिखाया जाएगा (वे 13 तक जोड़ते हैं, टिप्पणियों की कुल संख्या) और दूसरा सरणी x के लिए अंतराल सीमाएं हैं -एक्सिस।

एक जाँच कर सकते हैं कि वे समान रूप से दूरी पर हैं,

x = plt.hist(probability)[1]
for left, right in zip(x[:-1], x[1:]):
  print(left, right, right-left)

यहां छवि विवरण दर्ज करें

या, उदाहरण के लिए 3 डिब्बे (13 टिप्पणियों के लिए मेरा निर्णय कॉल) किसी को यह हिस्टोग्राम मिलेगा

plt.hist(probability, bins=3)

यहां छवि विवरण दर्ज करें

साजिश के साथ डेटा "सलाखों के पीछे" किया जा रहा है

यहां छवि विवरण दर्ज करें

प्रश्न के लेखक को यह स्पष्ट करने की आवश्यकता है कि मूल्यों की "संभावना" सूची का अर्थ क्या है - क्या "संभावना" प्रतिक्रिया चर का केवल एक नाम है (फिर क्यों हिस्टोग्राम के लिए एक्स-लेबल तैयार हैं, इसका कोई मतलब नहीं है ), या सूची मान डेटा से गणना की जाने वाली संभावनाएं हैं (फिर तथ्य यह है कि वे 1 तक नहीं जोड़ते हैं कोई मतलब नहीं है)।

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