2025, Oct 06 13:31
Matplotlib प्लॉट में अतिरिक्त क्षैतिज खाली जगह कैसे हटाएँ
Matplotlib प्लॉट में क्षैतिज padding हटाने के तरीके: Axes margins या xlim से डेटा को टाइट करें, और subplots_adjust या constrained_layout से बाहरी पैडिंग घटाएँ.
कभी-कभी Matplotlib के प्लॉट में अनचाही क्षैतिज पैडिंग रह जाती है, जिससे Axes की वास्तविक सामग्री किनारों पर अतिरिक्त खाली जगह के कारण दबी हुई दिखती है। यदि आप चाहते हैं कि प्लॉट किया गया डेटा उपलब्ध चौड़ाई को और कसकर घेरे, तो आपको Axes के भीतर के margins और Figure के भीतर Axes के चारों ओर की खाली जगह के बीच अंतर समझना होगा।
समस्या दिखाने वाला न्यूनतम उदाहरण
निम्नलिखित स्निपेट एक लाइन प्लॉट बनाता है और tight_layout को कॉल करता है, फिर भी प्लॉट और विंडो के बीच दिखाई देने वाली क्षैतिज पैडिंग छोड़ देता है।
import numpy as np, matplotlib.pyplot as plt
series = np.random.rand(100)
plt.figure(figsize=(12, 6), dpi=100)
plt.tight_layout()
plt.plot(series)
plt.show()थोड़ा अलग सेटअप, जिसमें Figure और Axes की जोड़ी पर DPI और आकार बदला गया है, वही दृश्य परिणाम देता है।
import numpy as np, matplotlib.pyplot as plt
series = np.random.rand(100)
board, axes = plt.subplots()
board.set_dpi(100)
board.set_size_inches(12, 6)
axes.autoscale_view('tight')
axes.plot(series)
plt.show()असल में क्या हो रहा है
इस स्पेसिंग समस्या के दो स्तर हैं। पहला, Axes स्वयं डेटा के चारों ओर मार्जिन सुरक्षित रख सकता है; margins इसी स्थान को नियंत्रित करता है। दूसरा, Figure Axes के चारों ओर बाहरी पैडिंग रखती है; इसे layout settings और subplots_adjust नियंत्रित करते हैं। Axes के margins बदलने से plotting क्षेत्र के भीतर की खाली जगह घटती है, लेकिन Axes और Figure की सीमा के बीच की खाली पट्टी पर असर नहीं पड़ता। यही कारण है कि axes.margins(x=0) जैसा कॉल प्लॉट और विंडो के बीच की जगह पर कोई दिखाई देने वाला प्रभाव नहीं दिखा सकता, जबकि Axes के अंदर थोड़ा trimming हो जाती है।
टाइमिंग का एक पहलू भी है: layout इंजनों को artists जोड़ने के बाद चलना चाहिए। लेआउट कॉल्स को अंत में ले जाने से वे सही सीमाएँ गणना कर पाते हैं।
tight_layout को plot कॉल के बाद रखें। इससे भी बेहतर, आधुनिक constrained layout का उपयोग करें।
सही स्तर को लक्षित करने वाले समाधान
यदि लक्ष्य Axes के भीतर की क्षैतिज पैडिंग घटाना है, तो x दिशा के margins को शून्य करें, या x-limits को डेटा रेंज पर स्पष्ट रूप से सेट करें।
import numpy as np, matplotlib.pyplot as plt
vals = np.random.rand(100)
frame, art = plt.subplots(figsize=(12, 6), dpi=100)
art.plot(vals)
art.margins(x=0)  # Axes के भीतर क्षैतिज खाली जगह को काटता है
# वही इरादा, स्पष्ट सीमाएँ देकर:
# art.set_xlim(0, len(vals) - 1)
plt.tight_layout()  # artists जोड़ने के बाद रखें
plt.show()यदि ध्यान Axes और Figure की किनारी के बीच की जगह पर है, तो subplot क्षेत्र को समायोजित करें या constrained layout सक्षम करें। मार्जिन घटाने से बाहरी पैडिंग सीधे कम होती है।
import numpy as np, matplotlib.pyplot as plt
values = np.random.rand(100)
fig_box, ax_obj = plt.subplots(figsize=(12, 6), dpi=100)
ax_obj.plot(values)
ax_obj.margins(x=0)  # वैकल्पिक: Axes के भीतर डेटा का कसा हुआ फिट
fig_box.subplots_adjust(left=0.02, right=0.98, top=0.98, bottom=0.05)
plt.show()वैकल्पिक रूप से, ऐसा लेआउट इंजन सक्षम करें जो बाहरी पैडिंग को स्वतः प्रबंधित करता है।
import numpy as np, matplotlib.pyplot as plt
seq = np.random.rand(100)
sheet, pane = plt.subplots(figsize=(12, 6), dpi=100, constrained_layout=True)
pane.plot(seq)
pane.margins(x=0)  # वैकल्पिक: डेटा को पूरी चौड़ाई में फिट करने के लिए
plt.show()क्यों ध्यान देना चाहिए
मार्जिन पर सटीक नियंत्रण यह सुनिश्चित करता है कि प्लॉट खाली जगह पर पिक्सेल खर्च करने के बजाय संदेश स्पष्ट रूप से पहुँचाएँ। इससे डैशबोर्ड कॉम्पैक्ट रहते हैं, एक्सपोर्ट सुसंगत होते हैं, और साथ-साथ की तुलना बेहतर तरीके से संरेखित रहती है। जब लेआउट और डेटा मार्जिन को अलग-अलग संभाला जाता है, तो आप गलत कंट्रोल को घुमाने से बचते हैं और अनुमानित, स्थिर परिणाम पाते हैं।
मुख्य बातें
पहले तय करें कि आपको Axes के भीतर की खाली जगह घटानी है या उसके चारों ओर की बाहरी पैडिंग। क्षैतिज रूप से डेटा को कसकर फिट करने के लिए axes.margins(x=0) या axes.set_xlim(0, len(data) - 1) जैसी स्पष्ट सीमाएँ उपयोग करें। Axes और Figure के बीच की दूरी घटाने के लिए fig.subplots_adjust का उपयोग करें, या आधुनिक स्वचालित लेआउट के लिए constrained_layout सक्षम करें। tight_layout को सभी plotting कॉल्स के बाद रखें ताकि लेआउट रूटीन अंतिम दृश्य के आधार पर गणना कर सके।
यह लेख StackOverflow पर प्रश्न (लेखक: Paul Jurczak) और Subir Chowdhury के उत्तर पर आधारित है।