2025, Oct 18 06:31
Matplotlib GridSpec से हिस्टोग्राम के साथ QQ प्लॉट्स की अतिरिक्त स्पेस हटाएँ
Matplotlib में हिस्टोग्राम और कई QQ प्लॉट को एक पंक्ति में बिना अनचाही क्षैतिज स्पेस के व्यवस्थित करें. GridSpec, width_ratios और wspace=0 से कॉम्पैक्ट लेआउट पाएं.
जब आप एक पंक्ति में हिस्टोग्राम और कई QQ प्लॉट मिलाते हैं, तो अक्सर QQ प्लॉट पैनलों के भीतर अजीब क्षैतिज खाली जगह बच जाती है, भले ही आप y-अक्ष के लेबल और टिक्स हटा दें। वैश्विक स्पेसिंग को समायोजित करना कभी-कभी मदद करता है, पर हमेशा नहीं—खासतौर पर तब, जब उप-ग्राफ आकार और सामग्री में अलग-अलग हों। यहाँ QQ प्लॉट्स को बिना अनचाही पैडिंग के एकदम सटा कर बिठाने का साफ-सुथरा तरीका है।
समस्या की रूपरेखा
लेआउट में एक हिस्टोग्राम है, जिसके बाद कई QQ प्लॉट आते हैं। QQ प्लॉट्स की y-अक्ष पर मौजूद लेबल हटाए गए हैं और स्केल एक जैसा रखने के लिए y-अक्ष साझा किया गया है। इसके बावजूद, हर QQ प्लॉट के अंदर बाईं ओर कुछ क्षैतिज पैडिंग बनी रहती है, जिसे आप हटाना चाहेंगे।
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
arr = np.random.normal(0, 1, 1000)
canvas, axe_row = plt.subplots(1, 4, figsize=(10, 4))
# पहला पैनल: हिस्टोग्राम
axe_row[0].hist([1, 2, 3], bins=30, edgecolor='black')
axe_row[0].set_ylabel('Count')
axe_row[0].set_xlabel('Val')
# बाकी पैनल: QQ प्लॉट
for a in axe_row[1:]:
    stats.probplot(arr, dist="norm", plot=a)
# QQ पैनलों पर y से जुड़ी जानकारी हटाएँ और y साझा करने का प्रयास करें
for a in axe_row[1:]:
    a.set_ylabel(None)
    a.tick_params(labelleft=False)
    a.sharey(axe_row[0])
canvas.tight_layout()
plt.show()
अतिरिक्त क्षैतिज जगह क्यों रह जाती है
वैश्विक स्पेसिंग वाले टूल अक्षों के बीच का गैप प्रभावित करते हैं, पर हर axes के अंदर टिक्स, स्पाइन और लेबल के लिए रखी गई आंतरिक पैडिंग/मार्जिन को नियंत्रित नहीं करते। y-अक्ष के लेबल और टिक्स छिपाने के बाद भी हर QQ axes बाईं ओर जगह सुरक्षित रख सकता है, इसलिए सिर्फ लेआउट कसने या अक्षों के बीच की स्पेसिंग घटाने से वह बची हुई जगह पूरी तरह नहीं मिटती। जब पहला सबप्लॉट हिस्टोग्राम हो और बाकी QQ प्लॉट, तो पैनलों के भीतर के मार्जिन अलग-अलग होते हैं, और नतीजतन असमान या जिद्दी खाली स्पेस दिखती रहती है।
समाधान: GridSpec, width_ratios और शून्य-चौड़ाई विभाजक
GridSpec लेआउट इस्तेमाल करें और चौड़ाइयों को स्पष्ट रूप से नियंत्रित करें। शून्य-चौड़ाई वाले स्तंभों को विभाजक के तौर पर जोड़कर और wspace को शून्य रखने से, आप QQ प्लॉट्स के बीच की क्षैतिज दूरी को दृश्य रूप से मिटा सकते हैं, जबकि हिस्टोग्राम अपनी उचित चौड़ाई पर बना रहता है।
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
arr = np.random.normal(0, 1, 1000)
fig_obj = plt.figure(figsize=(10, 4))
layout = fig_obj.add_gridspec(
    1, 7,
    width_ratios=[1.5, 0.5, 1, 0.00, 1, 0.00, 1],
    wspace=0
)
# हिस्टोग्राम
ax_histogram = fig_obj.add_subplot(layout[0])
ax_histogram.hist([1, 2, 3], bins=30, edgecolor='black')
ax_histogram.set_ylabel('Count')
ax_histogram.set_xlabel('Val')
# QQ प्लॉट: इन्हें स्तंभ 2, 4, 6 में रखें; बीच में शून्य-चौड़ाई स्पेसर हों
qq_axes = [fig_obj.add_subplot(layout[i]) for i in range(2, 7, 2)]
stats.probplot(arr, dist="norm", plot=qq_axes[0])
qq_axes[0].set_ylabel('Y_label')
for ax in qq_axes[1:]:
    stats.probplot(arr, dist="norm", plot=ax)
    ax.set_ylabel(None)
    ax.set_yticklabels([])
    ax.set_yticks([])
    ax.spines['left'].set_visible(False)
    ax.get_yaxis().set_visible(False)
plt.show()
इस तरीके में सात-स्तंभी ग्रिड स्पष्ट रूप से परिभाषित होता है: हिस्टोग्राम को अधिक चौड़ाई मिलती है, QQ प्लॉट्स को बारी-बारी से स्तंभों में रखा जाता है, और उनके बीच वाले स्तंभों की चौड़ाई शून्य रहती है। wspace शून्य होने पर QQ प्लॉट्स आपस में सट जाते हैं, और पहले बनी हुई क्षैतिज खाली जगह गायब हो जाती है।
यह क्यों मायने रखता है
जब उप-ग्राफ अनचाही मार्जिन से नहीं घिरे होते, तो डायग्नोस्टिक्स पढ़ना आसान हो जाता है। कॉम्पैक्ट डैशबोर्ड, प्रकाशनों या त्वरित EDA रिपोर्टों में क्षैतिज स्पेस का हर पिक्सल महत्वपूर्ण होता है। पूर्वानुमेय लेआउट से एलाइनमेंट पर सोचना सरल होता है और अलग-अलग QQ प्लॉट्स के वितरणों की तुलना सहज बनती है।
समापन
अगर QQ प्लॉट्स के बीच जिद्दी गैप दिखें, तो सिर्फ वैश्विक स्पेसिंग कंट्रोल्स से आगे बढ़कर ग्रिड पर नियंत्रण लें। GridSpec के साथ width_ratios और wspace=0 आपको चौड़ाई वहीं बाँटने देता है जहाँ जरूरत है, जबकि शून्य-चौड़ाई वाले स्तंभ अदृश्य विभाजक की तरह काम कर अनावश्यक आंतरिक स्पेस हटाते हैं। QQ पैनलों पर y-अक्ष के तत्व छिपाएँ, y-स्केल सुसंगत रखें, और पूरी पंक्ति बिना व्यर्थ स्पेस के साफ पढ़ी जाएगी।