मुख्य सामग्री पर जाएं

Matplotlib में हिस्टोग्राम

हिस्टोग्राम के बारे में जानें और matplotlib की मदद से उन्हें डेटा से अंतर्दृष्टि पाने के लिए कैसे उपयोग करें।
अपडेट किया गया 25 सित॰ 2026  · 8 मि॰ पढ़ें

AI के साथ खोजें

ChatGPTClaudePerplexity

परिचय

विकिपीडिया के अनुसार, हिस्टोग्राम संख्यात्मक डेटा के वितरण का एक सटीक ग्राफ़िकल निरूपण है। यह किसी सतत चर (मात्रात्मक चर) के प्रायिकता वितरण का एक आकलन है और इसे सबसे पहले Karl Pearson ने प्रस्तुत किया था। यह बार ग्राफ़ का एक प्रकार है। हिस्टोग्राम बनाने के लिए, पहला चरण मानों के दायरे को “बिन” करना है — यानी पूरे दायरे को कई अंतरालों में बाँटना — और फिर यह गिनना कि प्रत्येक अंतराल में कितने मान आते हैं। प्रायः बिन किसी चर के क्रमागत, एक-दूसरे से न ओवरलैप करने वाले अंतराल के रूप में निर्दिष्ट किए जाते हैं। बिन (अंतराल) एक-दूसरे से सटे होने चाहिए और अक्सर (पर आवश्यक नहीं) समान आकार के होते हैं।

संख्यात्मक डेटा के अलावा, हिस्टोग्राम का उपयोग छवियों के वितरण को दर्शाने के लिए भी किया जा सकता है, क्योंकि छवियाँ 0 से 255 तक के चित्र तत्त्वों (पिक्सेल) का संयोजन भर होती हैं। हिस्टोग्राम का x-अक्ष बिनों की संख्या को दर्शाता है जबकि y-अक्ष किसी विशेष बिन की आवृत्ति को दर्शाता है। बिनों की संख्या एक पैरामीटर है, जिसे आप अपने डेटा के वितरण को कैसे देखना चाहते हैं, उसके अनुसार बदला जा सकता है।

उदाहरण के लिए: मान लीजिए, आप 0 से 255 तक पिक्सेल मानों वाली एक RGB छवि का हिस्टोग्राम प्लॉट करना चाहते हैं। इस छवि में अधिकतम 255 बिन हो सकते हैं। यदि आप x_axis (बिनों की संख्या) को 255 रखते हैं, तो y_axis उस छवि में प्रत्येक पिक्सेल की आवृत्ति को दिखाएगा।

हिस्टोग्राम भावना में bar ग्राफ़ के समान होते हैं, आइए हिस्टोग्राम का एक चित्रात्मक उदाहरण देखें:

हिस्टोग्राम संख्यात्मक डेटा या छवि डेटा के प्रायिकतामूलक वितरण को दृश्य रूप में समझने का उत्कृष्ट साधन है, जिसे लगभग हर कोई सहज रूप से समझ सकता है। Python में हिस्टोग्राम बनाने और प्लॉट करने के कई विकल्प हैं। Python में ग्राफ़ बनाने के लिए कुछ इन-बिल्ट लाइब्रेरीज़ हैं, और ऐसी ही एक लाइब्रेरी है matplotlib।

आज के ट्यूटोरियल में, आप मुख्यतः matplotlib का उपयोग विभिन्न प्रकार के डेटा सेट्स पर हिस्टोग्राम बनाने और उन्हें विज़ुअलाइज़ करने के लिए करेंगे।

तो बिना देर किए, शुरू करते हैं।

NumPy और Matplotlib का उपयोग करके हिस्टोग्राम प्लॉट करना

import numpy as np

पुनरुत्पादकता के लिए, आप numPy के seed फ़ंक्शन का उपयोग करेंगे, जो हर बार निष्पादन पर समान आउटपुट देगा।

आप gaussian (normal) distribution का हिस्टोग्राम प्लॉट करेंगे, जिसका माध्य 0 और मानक विचलन 1 होगा।

np.random.seed(100)
np_hist = np.random.normal(loc=0, scale=1, size=1000)
np_hist[:10]
array([-1.74976547,  0.3426804 ,  1.1530358 , -0.25243604,  0.98132079,
        0.51421884,  0.22117967, -1.07004333, -0.18949583,  0.25500144])

आइए ऊपर दिए गए वितरण का माध्य और मानक विचलन सत्यापित करें।

np_hist.mean(),np_hist.std()
(-0.016772157343909157, 1.0458427194167)

अगले चरण में, आप numPy का histogram फ़ंक्शन उपयोग करेंगे, जो hist और bin_edges लौटाएगा।

hist,bin_edges = np.histogram(np_hist)
hist
array([  7,  37, 111, 207, 275, 213, 105,  31,  10,   4])
bin_edges
array([-3.20995538, -2.50316588, -1.79637637, -1.08958687, -0.38279736,
        0.32399215,  1.03078165,  1.73757116,  2.44436066,  3.15115017,
        3.85793967])

अब, matplotlib के plt.bar फ़ंक्शन का उपयोग करके हिस्टोग्राम प्लॉट करते हैं, जहाँ x-अक्ष और y-अक्ष क्रमशः bin_edges और hist होंगे।

import matplotlib.pyplot as plt
%matplotlib inline
plt.figure(figsize=[10,8])

plt.bar(bin_edges[:-1], hist, width = 0.5, color='#0504aa',alpha=0.7)
plt.xlim(min(bin_edges), max(bin_edges))
plt.grid(axis='y', alpha=0.75)
plt.xlabel('Value',fontsize=15)
plt.ylabel('Frequency',fontsize=15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.ylabel('Frequency',fontsize=15)
plt.title('Normal Distribution Histogram',fontsize=15)
plt.show()

आइए bin_edges को पूर्णांक में राउंड कर दें।

bin_edges = np.round(bin_edges,0)
plt.figure(figsize=[10,8])

plt.bar(bin_edges[:-1], hist, width = 0.5, color='#0504aa',alpha=0.7)
plt.xlim(min(bin_edges), max(bin_edges))
plt.grid(axis='y', alpha=0.75)
plt.xlabel('Value',fontsize=15)
plt.ylabel('Frequency',fontsize=15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.ylabel('Frequency',fontsize=15)
plt.title('Normal Distribution Histogram',fontsize=15)
plt.show()

अब ग्राफ़ काफ़ी बेहतर दिख रहा है, है ना?

hist और bin_edges को समझने के लिए, एक उदाहरण देखते हैं:

आप मनमाने मानों वाली एक array परिभाषित करेंगे और बिनों को 5 की रेंज के साथ परिभाषित करेंगे।

hist, bin_edges = np.histogram([1, 1, 2, 2, 2, 2, 3],bins=range(5))
hist
array([0, 2, 4, 1])

ऊपर के आउटपुट में, hist दर्शाता है कि बिन 0 में 0 आइटम हैं, बिन 1 में 2, बिन 3 में 4, बिन 4 में 1।

bin_edges
array([0, 1, 2, 3, 4])

इसी प्रकार, ऊपर दिया गया bin_edges आउटपुट बताता है कि बिन 0 अंतराल [0,1) में है, बिन 1 [1,2) में, बिन 2 [2,3) में, बिन 3 [3,4) में।

केवल Matplotlib का उपयोग करके हिस्टोग्राम प्लॉट करना

matplotlib का उपयोग करके हिस्टोग्राम प्लॉट करना बहुत सरल है। आपको बस matplotlib के plt.hist() फ़ंक्शन का उपयोग करना है और डेटा के साथ बिनों की संख्या तथा कुछ वैकल्पिक पैरामीटर पास करने हैं।

plt.hist() में, bins='auto' पास करने से आपको “आदर्श” बिनों की संख्या मिलती है। विचार यह है कि ऐसा बिन चौड़ाई चुनी जाए जो आपके डेटा का सबसे विश्वसनीय निरूपण दे।

बस इतना ही। अब, numpy से बनाए गए normal_distribution का हिस्टोग्राम प्लॉट करते हैं।

plt.figure(figsize=[10,8])
n, bins, patches = plt.hist(x=np_hist, bins=8, color='#0504aa',alpha=0.7, rwidth=0.85)
plt.grid(axis='y', alpha=0.75)
plt.xlabel('Value',fontsize=15)
plt.ylabel('Frequency',fontsize=15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.ylabel('Frequency',fontsize=15)
plt.title('Normal Distribution Histogram',fontsize=15)
plt.show()

दो हिस्टोग्राम एक साथ प्लॉट करना

plt.figure(figsize=[10,8])
x = 0.3*np.random.randn(1000)
y = 0.3*np.random.randn(1000)
n, bins, patches = plt.hist([x, y])

Pandas का उपयोग करके Iris डेटा का हिस्टोग्राम प्लॉट करना

आप sklearn का उपयोग iris नामक डेटा सेट को लोड करने के लिए करेंगे। sklearn में datasets नामक एक लाइब्रेरी है जिसमें Iris डेटा सेट मौजूद है, जिसे आप तुरंत लोड कर सकते हैं। तो, आइए iris डेटा सेट को जल्दी से लोड करें।

from sklearn.datasets import load_iris
import pandas as pd
data = load_iris().data
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width']

अगले चरण में, आप iris डेटा सेट का डेटा फ्रेम बनाएंगे।

dataset = pd.DataFrame(data,columns=names)
dataset.head()
  sepal-length sepal-width petal-length petal-width
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
dataset.columns[0]
'sepal-length'

अंत में, आप pandas के इन-बिल्ट फ़ंक्शन .hist() का उपयोग करेंगे, जो डेटा सेट में मौजूद सभी फीचर्स के लिए हिस्टोग्राम प्लॉट कर देगा।

क्या यह शानदार नहीं है?

fig = plt.figure(figsize = (8,8))
ax = fig.gca()
dataset.hist(ax=ax)
plt.show()

petal-length, petal-width, और sepal-length एक एकचोटी (unimodal) वितरण दिखाते हैं, वहीं sepal-width एक Gaussian वक्र को प्रतिबिंबित करता है। ये सभी उपयोगी विश्लेषण हैं क्योंकि तब आप ऐसे एल्गोरिद्म के बारे में सोच सकते हैं जो इस तरह के वितरण के साथ अच्छा काम करते हैं।

Matplotlib के साथ हिस्टोग्राम प्लॉट करें

plt.figure(figsize=[10,10])
f,a = plt.subplots(2,2)
a = a.ravel()
for idx,ax in enumerate(a):
    ax.hist(dataset.iloc[:,idx], bins='auto', color='#0504aa',alpha=0.7, rwidth=0.85)
    ax.set_title(dataset.columns[idx])
plt.tight_layout()
<Figure size 720x720 with 0 Axes>

बाइनरी और RGB छवियों का हिस्टोग्राम प्लॉट करना

ट्यूटोरियल के अंतिम भाग में, आप दो अलग-अलग डोमेन की छवियों का विज़ुअलाइज़ेशन करेंगे: बाइनरी (दस्तावेज़) और प्राकृतिक छवियाँ। बाइनरी छवियाँ वे होती हैं जिनके पिक्सेल मान अधिकतर 0 या 255 होते हैं, जबकि किसी रंग चैनल वाली छवि में पिक्सेल मान 0 से 255 के बीच कहीं भी हो सकते हैं।

किसी छवि के तीव्रता मानों का हिस्टोग्राम प्लॉट करके पिक्सेल वितरण का विश्लेषण करना किसी दी गई छवि के प्रत्येक पिक्सेल की आवृत्ति को मापने का सही तरीका है। 8-बिट ग्रेस्केल छवि के लिए 256 संभावित तीव्रता मान होते हैं। अतः पिक्सेल वितरण डोमेन में दस्तावेज़ और प्राकृतिक छवियों के बीच अंतर का अध्ययन करने के लिए, आप दस्तावेज़ और प्राकृतिक छवि के लिए क्रमशः दो हिस्टोग्राम प्लॉट करेंगे। यह मानते हुए कि पठनीय दस्तावेज़ों में विरलता होती है, इन दस्तावेज़ छवियों में पिक्सेलों का वितरण अधिकांशतः तिरछा होना चाहिए।

आप opencv मॉड्यूल का उपयोग करके दोनों छवियाँ लोड करेंगे, उन्हें पढ़ते समय पैरामीटर 0 पास करके ग्रेस्केल में बदलेंगे, और अंत में उन्हें समान आकार में रिसाइज़ करेंगे।

import cv2
lena_rgb = cv2.imread('lena.png')
lena_gray = cv2.cvtColor(lena_rgb,cv2.COLOR_BGR2GRAY)
lena_gray.shape
(512, 512)
binary = cv2.imread('binary.png')
binary.shape
(1394, 2190, 3)
binary = cv2.resize(binary,(512,512),cv2.INTER_CUBIC)
binary.shape
(512, 512, 3)
binary_gray = cv2.cvtColor(binary,cv2.COLOR_BGR2GRAY)
binary_gray.shape
(512, 512)

आइए प्राकृतिक और दस्तावेज़ दोनों छवियों को विज़ुअलाइज़ करें।

plt.figure(figsize=[10,10])

plt.subplot(121)
plt.imshow(lena_rgb[:,:,::-1])
plt.title("Natural Image")

plt.subplot(122)
plt.imshow(binary[:,:,::-1])
plt.title("Document Image")
plt.show()

टिप्पणी: आप bins को 255 के बराबर उपयोग करेंगे, क्योंकि किसी छवि में कुल 255 पिक्सेल नहीं बल्कि 256 संभावित मान होते हैं, और आप 0 से 255 तक छवि के प्रत्येक पिक्सेल मान की आवृत्ति को विज़ुअलाइज़ करना चाहते हैं।

hist, edges = np.histogram(binary_gray,bins=range(255))
plt.figure(figsize=[10,8])

plt.bar(edges[:-1], hist, width = 0.8, color='#0504aa')
plt.xlim(min(edges), max(edges))
plt.grid(axis='y', alpha=0.75)
plt.xlabel('Value',fontsize=15)
plt.ylabel('Frequency',fontsize=15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.ylabel('Frequency',fontsize=15)
plt.title('Document Image Histogram',fontsize=15)
plt.show()
hist, edges = np.histogram(lena_gray,bins=range(260))
plt.figure(figsize=[10,8])

plt.bar(edges[:-1], hist, width = 0.5, color='#0504aa')
plt.xlim(min(edges), max(edges))
plt.grid(axis='y', alpha=0.75)
plt.xlabel('Pixels',fontsize=15)
plt.ylabel('Frequency of Pixels',fontsize=15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.ylabel('Frequency',fontsize=15)
plt.title('Natural Image Histogram',fontsize=15)
plt.show()

ऊपर दिए गए चित्रों से आप देख सकते हैं कि natural image सभी 256 तीव्रताओं में फैली हुई है और उसका वितरण random है, जबकि दस्तावेज़ छवि unimodal वितरण दिखाती है और उसका अधिकांश भाग 0 से 255 के पिक्सेल मानों के बीच तिरछा है।

निष्कर्ष

ट्यूटोरियल पूरा करने के लिए बधाई।

यह ट्यूटोरियल numpy और pandas की मदद से matplotlib का उपयोग करके हिस्टोग्राम बनाने का एक अच्छा शुरुआती बिंदु था।

आपने यह भी सीखा कि कैसे हिस्टोग्राम की शक्ति का उपयोग करके दो अलग-अलग छवि डोमेनों — दस्तावेज़ और प्राकृतिक छवि — में अंतर किया जा सकता है।

यदि आप डेटा विज़ुअलाइज़ेशन तकनीकों के बारे में और सीखना चाहते हैं, तो DataCamp का Data Visualization with Matplotlib कोर्स करने पर विचार करें।

कृपया नीचे टिप्पणी अनुभाग में इस ट्यूटोरियल से संबंधित कोई भी प्रश्न निःसंकोच पूछें।

विषय
Python
डेटा विज़ुअलाइज़ेशन

Python के बारे में और जानें

कोर्स

Matplotlib के साथ डेटा विज़ुअलाइज़ेशन परिचय

4 घंटा
235.6K
Matplotlib का उपयोग करके डेटा विज़ुअलाइज़ेशन बनाना, अनुकूलित करना और साझा करना सीखें।
विवरण देखेंRight Arrow
पाठ्यक्रम शुरू करें
और देखेंRight Arrow