2025, Nov 01 02:02
Matplotlib में superscript/subscript के लिए एकरूप फ़ॉन्ट कैसे पाएं
Matplotlib में superscript/subscript फ़ॉन्ट असंगति दूर करें: Computer Modern में W/cm² लेबल को एकरूप बनाने के लिए \mathregular और mathtext सेटिंग्स गाइड.
रिपोर्ट के साथ आकृतियों का दृश्य सामंजस्य बनाए रखना मायने रखता है, खासकर तब जब एक ही लेबल के अंदर फ़ॉन्ट आपस में मेल न खाएं। Matplotlib में अक्सर होने वाली दिक्कत यह है कि लेबल के superscript और subscript आसपास के टेक्स्ट से अलग फ़ॉन्ट फेस में रेंडर हो जाते हैं, भले ही आपने कोई खास फ़ॉन्ट फैमिली सेट की हो। अगर आप Computer Modern (pdfLaTeX में इस्तेमाल होने वाला डिफ़ॉल्ट फ़ॉन्ट) पर निर्भर हैं और “W/cm²” में superscript 2 अजीब लग रहा है, तो समाधान बिल्कुल सीधा है।
समस्या की सेटिंग
उद्देश्य यह है कि पूरी फ़िगर में Computer Modern ही उपयोग हो—शीर्षक, अक्ष लेबल और इकाइयाँ। नीचे दी गई कॉन्फ़िगरेशन serif फ़ैमिली और cmr10 फेस चुनती है, और math text हैंडलिंग सक्षम करती है:
import matplotlib.pyplot as gp
import matplotlib as mp
mp.rcParams['font.family'] = "serif"
mp.rcParams['font.serif'] = "cmr10"
mp.rcParams['axes.formatter.use_mathtext'] = True
canvas, axes = gp.subplots()
axes.set_title('Results', fontsize=18)
axes.set_ylabel(r'Heat Flux (W/cm$^2$)', fontsize=18)
axes.set_xlabel('Wall Superheat (K)', fontsize=18)
axes.legend()
लेबल तो दिखता है, मगर superscript 2 बाकी टेक्स्ट जैसा फेस नहीं लेता। यही दृश्य असंगति subscript के साथ भी दिखाई देती है।
क्या हो रहा है
जैसे ही आप math text लिखते हैं, फ़ॉन्ट बदल जाता है। ऊपर के उदाहरण में डॉलर साइन के भीतर का हिस्सा बाकी स्ट्रिंग से अलग तरह से हैंडल होता है, इसलिए superscript 2 उस math फ़ॉन्ट में typeset होता है जो चुने गए serif फेस से मेल नहीं खाता। नतीजा: इकाइयों के टेक्स्ट और घात के बीच हल्का लेकिन दिखने वाला अंतर।
समाधान
math वाले हिस्से को सामान्य टेक्स्ट फ़ॉन्ट ही इस्तेमाल करने के लिए बाध्य करें। आसान तरीका यह है कि यूनिट स्ट्रिंग को \mathregular में लपेटें और superscript को उसके अंदर रखें:
import matplotlib.pyplot as gp
import matplotlib as mp
mp.rcParams['font.family'] = "serif"
mp.rcParams['font.serif'] = "cmr10"
mp.rcParams['axes.formatter.use_mathtext'] = True
fig_obj, axis_ref = gp.subplots()
axis_ref.set_title('Results', fontsize=18)
axis_ref.set_ylabel('Heat Flux ($\mathregular{W/cm^{2}}$)', fontsize=18)
axis_ref.set_xlabel('Wall Superheat (K)', fontsize=18)
इससे superscript 2, लेबल के बाकी हिस्से की तरह ही Computer Modern फेस में रेंडर होता है।
एक और तरीका है कि math text कॉन्फ़िगरेशन को ऐसा समायोजित करें कि math भाग आपके चुने हुए फ़ॉन्ट का अनुसरण करे। मौजूदा सेटिंग्स के साथ, ये भी सेट करें:
mp.rcParams['mathtext.fontset'] = "custom"
mp.rcParams['mathtext.rm'] = "serif"
जहाँ math text की जरूरत नहीं होती, वहाँ आप पूरी तरह math से बच सकते हैं—लेबल स्ट्रिंग में Unicode superscript का इस्तेमाल करें:
axis_ref.set_ylabel('Heat Flux (W/cm\u00b2)', fontsize=18)
यह क्यों मायने रखता है
फ़ॉन्ट की असंगति फ़िगर की लय तोड़ देती है और अन्यथा सधे हुए प्लॉट भी असमान लगने लगते हैं। जब फ़िगर ऐसे पेपर, थीसिस या रिपोर्ट में जाते हैं जो Computer Modern पर टिके होते हैं, तो बेमेल superscript ध्यान डेटा से हटा देते हैं। यह सुनिश्चित करना कि घात और आसपास का टेक्स्ट एक ही फेस साझा करें, विज़ुअल्स को सुसंगत और पेशेवर बनाए रखता है।
निष्कर्ष
ध्यान रखें कि आपके लेबल स्ट्रिंग्स कब math हैंडलिंग में चली जाती हैं। अगर आपको superscript या subscript चाहिए, लेकिन रूप-रंग आपके टेक्स्ट फ़ॉन्ट जैसा ही रखना है, तो संबंधित हिस्से को \mathregular में लपेटें, या math text सेटिंग्स को इस तरह ट्यून करें कि math आपकी serif पसंद का पालन करे। और यदि math पार्सिंग की जरूरत नहीं, तो Unicode superscript एक साफ-सुथरा और सरल विकल्प है। यहाँ निरंतरता पढ़ने में आसानी और प्रस्तुति की गुणवत्ता—दोनों में लाभ देती है।
यह लेख StackOverflow के एक प्रश्न पर आधारित है, जिसे simply_a_student ने पूछा था, और simply_a_student द्वारा दिए गए उत्तर पर।