2025, Oct 22 09:47
openpyxl में Excel बार चार्ट का शीर्षक ओवरले बंद करने की गाइड
openpyxl से बने Excel बार चार्ट में शीर्षक बार्स पर चढ़ रहा है? overlay को False करें और साफ़ लेआउट पाएं; BarChart, dataLabels व ManualLayout सेटिंग्स गाइड।
openpyxl के जरिए Excel चार्ट बनाते समय अक्सर यह अप्रत्याशित स्थिति आती है कि चार्ट का शीर्षक सीधे बार्स के ऊपर आकर बैठ जाता है। चार्ट का आकार बदलना या लेआउट में थोड़ी-बहुत फेरबदल कर शीर्षक को खिसकाने की कोशिश भी कई बार बेअसर रहती है। इसकी वजह Excel का ओवरले व्यवहार है, यानी वह चार्ट तत्वों को ओवरले के रूप में कैसे ट्रीट करता है।
समस्या को पुनः उत्पन्न करना
नीचे दिया गया स्निपेट एक बार चार्ट बनाता है और उसे वर्कशीट पर रखता है। यह शीर्षक को फॉर्मैट करता है, डेटा लेबल सक्षम करता है, रंग सेट करता है और ManualLayout से शीर्षक को खिसकाने की कोशिश करता है। इसके बावजूद शीर्षक प्लॉटेड डेटा के ऊपर आता रहता है।
# ws_metrics सक्रिय वर्कशीट है
# चार्ट बनाएँ
bar_plot = BarChart()
# सीरीज़ और श्रेणियाँ
series_ref = Reference(ws_metrics, min_col=3, min_row=3, max_row=14)
cat_ref = Reference(ws_metrics, min_col=1, min_row=3, max_row=14)
bar_plot.title = "Custom Title"
bar_plot.title.text.rich.paragraphs[0].pPr = ParagraphProperties(defRPr=CharacterProperties(sz=1250))
manual_pos = ManualLayout(xMode="edge", yMode="edge", x=0.0, y=-0.05)
bar_plot.title.layout = Layout(manualLayout=manual_pos)
bar_plot.add_data(series_ref, titles_from_data=False)
bar_plot.set_categories(cat_ref)
bar_plot.dataLabels = DataLabelList()
bar_plot.dataLabels.showVal = True
bar_plot.dataLabels.showSerName = False
bar_plot.dataLabels.showCatName = False
bar_plot.dataLabels.showLegendKey = False
bar_plot.legend = None
bar_plot.x_axis.delete = False
bar_plot.y_axis.delete = False
first_series = bar_plot.series[0]
first_series.graphicalProperties.solidFill = "379e3e"
ws_metrics.add_chart(bar_plot, "F3")
असल में हो क्या रहा है
Excel की डिफॉल्ट सेटिंग्स समय के साथ बदली हैं। चार्ट टाइटल, ऐक्सिस टाइटल और लीजेंड जैसे घटकों के लिए एक overlay एट्रिब्यूट तय करता है कि तत्व प्लॉट एरिया के ऊपर तैरेंगे या नहीं। पुराने Excel संस्करणों में इसका डिफॉल्ट False था। मौजूदा संस्करणों में डिफॉल्ट True है। ओवरले चालू होने पर, चार्ट का शीर्षक आकार या मैनुअल लेआउट ऑफ़सेट के बावजूद चार्ट एरिया में घुस सकता है।
समाधान
ओवरले को स्पष्ट रूप से बंद करें। संबंधित overlay फ्लैग्स को False पर सेट करें ताकि Excel इन तत्वों के लिए अलग जगह आरक्षित करे, न कि उन्हें प्लॉटेड डेटा के ऊपर चढ़ा दे। ऐक्सिस टाइटल्स में एक delete एट्रिब्यूट भी होता है, जिसे दिखाना हो तो False होना चाहिए।
# ws_metrics सक्रिय वर्कशीट है
# चार्ट बनाएँ
bar_plot = BarChart()
# सीरीज़ और श्रेणियाँ
series_ref = Reference(ws_metrics, min_col=3, min_row=3, max_row=14)
cat_ref = Reference(ws_metrics, min_col=1, min_row=3, max_row=14)
bar_plot.title = "Custom Title"
bar_plot.title.text.rich.paragraphs[0].pPr = ParagraphProperties(defRPr=CharacterProperties(sz=1250))
manual_pos = ManualLayout(xMode="edge", yMode="edge", x=0.0, y=-0.05)
bar_plot.title.layout = Layout(manualLayout=manual_pos)
bar_plot.add_data(series_ref, titles_from_data=False)
bar_plot.set_categories(cat_ref)
bar_plot.dataLabels = DataLabelList()
bar_plot.dataLabels.showVal = True
bar_plot.dataLabels.showSerName = False
bar_plot.dataLabels.showCatName = False
bar_plot.dataLabels.showLegendKey = False
# साफ-सुथरे लेआउट के लिए ओवरले बंद रखें
bar_plot.title.overlay = False
# यदि आपके वातावरण में मौजूद हों, तो इन्हें भी सेट कर सकते हैं:
# bar_plot.x_axis.title.overlay = False
# bar_plot.y_axis.title.overlay = False
# यदि आप लीजेंड का उपयोग करते हैं:
# bar_plot.legend.overlay = False
bar_plot.legend = None
bar_plot.x_axis.delete = False
bar_plot.y_axis.delete = False
first_series = bar_plot.series[0]
first_series.graphicalProperties.solidFill = "379e3e"
ws_metrics.add_chart(bar_plot, "F3")
bar_plot.title.overlay = False सेट करना ही शीर्षक को बार्स के ऊपर चढ़ने से रोकने के लिए पर्याप्त है। कुछ वातावरणों में x_axis.title.overlay तक पहुंचने पर एट्रिब्यूट एरर आ सकता है; ऐसी स्थिति में चार्ट टाइटल के ओवरले पर ही ध्यान दें। अगर आप ऐक्सिस टाइटल्स या लीजेंड सक्षम करते हैं, तो उनके ओवरले भी इसी तरह बंद किए जा सकते हैं।
यह क्यों मायने रखता है
ओवरले व्यवहार को डिफॉल्ट पर छोड़ देने से चार्ट रेंडरिंग इस बात पर निर्भर हो जाती है कि फ़ाइल किस Excel संस्करण में खुली है। नतीजतन, कुछ सेटअप्स में टाइटल या लीजेंड डेटा के ऊपर आ सकते हैं और किसी अन्य में अलग तरह से दिखेंगे। ओवरले को स्पष्ट रूप से नियंत्रित करने से आउटपुट सुसंगत और पढ़ने में आसान रहता है।
मुख्य बातें
अगर चार्ट का शीर्षक आपकी बार्स या लाइन्स में घुस रहा है, तो पहले चार्ट के आयाम या मैनुअल पोजिशनिंग से जूझने के बजाय शीर्षक का ओवरले बंद करें, ताकि Excel प्लॉट एरिया के बाहर जगह दे। जब ऐक्सिस दिखाने हों, तो x_axis.delete और y_axis.delete को False ही रखें, और जिन अन्य तत्वों का उपयोग करें, उनके ओवरले भी निष्क्रिय करें। यह छोटा-सा, स्पष्ट कॉन्फ़िगरेशन लेआउट को पूर्वानुमेय रखता है और डेटा को पठनीय बनाता है।
यह लेख StackOverflow पर एक प्रश्न (लेखक: Sagar Kulkarni) और Axel Richter के उत्तर पर आधारित है।