2025, Sep 28 03:30

Altair heatmap export में बॉर्डर गायब? कारण और समाधान

Altair heatmap Jupyter में ठीक, पर PNG/SVG/PDF export पर बॉर्डर गायब हो सकते हैं. वजह: stroke='w' वैध रंग नहीं. white, #eeeeee से इसे ठीक करें

Altair heatmaps Jupyter नोटबुक में बिल्कुल ठीक दिख सकते हैं, लेकिन save() के जरिए PNG, SVG या PDF में निर्यात करते समय उनकी सेल बॉर्डर खो सकती हैं। अगर नोटबुक प्रीव्यू में मोटी ग्रिड लाइनें दिखती हैं, लेकिन सेव की गई इमेज में बेहद पतली लाइनें या बिल्कुल बॉर्डर नहीं दिखते, तो वजह एक दिखने में निर्दोष रंग का शॉर्टहैंड हो सकता है।

समस्या कैसे दोहराएँ

नीचे दिया उदाहरण नोटबुक में चौड़ी बॉर्डर वाला हीटमैप दिखाता है, लेकिन निर्यात की गई इमेज में बॉर्डर या तो गायब हो जाती है या बेहद पतली रह जाती है।

import altair as alt
import pandas as pd
# नमूना डेटासेट
frame_src = pd.DataFrame({
    'X': [1,2,3,4,5,6,7,8,9,10],
    'Y': [1,2,3,4,5,6,7,8,9,10],
    'Intensity': [0,0,0,0,0,1,1,1,1,1]
})
levels = [0, 1]
palette = ['#208943', '#c0e6ba']
# मोटी स्ट्रोक वाला हीटमैप; नोटबुक में ठीक दिखता है
map_fig = alt.Chart(frame_src).mark_rect(stroke='w', strokeWidth=5).encode(
    x=alt.X('X:N'),
    y=alt.Y('Y:N'),
    color=alt.Color('Intensity:N', scale=alt.Scale(domain=levels, range=palette))
)
# ऐसे निर्यात जिनमें बॉर्डर गायब हो सकती है या बहुत पतली हो सकती है
map_fig.save('test.png')
map_fig.save('test.svg')
map_fig.save('test.pdf')
map_fig

यह क्यों हो रहा है

यह व्यवहार Altair/Vega की एक ज्ञात समस्या से मेल खाता है, जो stroke='w' इस्तेमाल करने पर ट्रिगर होती है। मान w कोई वैध HTML रंग स्ट्रिंग नहीं है। नोटबुक रेंडरर बॉर्डर उम्मीद के मुताबिक दिखा देता है, लेकिन एक्सपोर्ट पाइपलाइन w को वैध रंग नहीं मानती—नतीजतन स्ट्रोक गायब हो जाता है या असंगत रूप से रेंडर होता है। यही वजह है कि कुछ मामलों में PNG/SVG में बेहद पतली रेखाएँ दिख सकती हैं, और PDF में बॉर्डर पूरी तरह गायब हो सकते हैं।

समाधान

स्ट्रोक के लिए वैध रंग मान का उपयोग करें। 'white' जैसे सही रंग नाम पर स्विच करने से नोटबुक प्रीव्यू और एक्सपोर्टेड फ़ाइलों—दोनों में—बॉर्डर सुसंगत रहते हैं। यदि आपके सेटअप पर शुद्ध सफेद पृष्ठभूमि में घुल-मिल जाता है, तो '#eeeeee' जैसा हल्का ग्रे दृश्यता बेहतर कर सकता है और वही लेआउट बनाए रखता है।

import altair as alt
import pandas as pd
# नमूना डेटासेट
frame_src = pd.DataFrame({
    'X': [1,2,3,4,5,6,7,8,9,10],
    'Y': [1,2,3,4,5,6,7,8,9,10],
    'Intensity': [0,0,0,0,0,1,1,1,1,1]
})
levels = [0, 1]
palette = ['#208943', '#c0e6ba']
# सुधार: स्ट्रोक के लिए वैध रंग स्ट्रिंग का उपयोग करें
map_fig_fixed = alt.Chart(frame_src).mark_rect(stroke='white', strokeWidth=5).encode(
    x=alt.X('X:N'),
    y=alt.Y('Y:N'),
    color=alt.Color('Intensity:N', scale=alt.Scale(domain=levels, range=palette))
)
map_fig_fixed.save('test.png')
map_fig_fixed.save('test.svg')
map_fig_fixed.save('test.pdf')
map_fig_fixed

बेहतर दृश्यता के लिए विकल्प:

map_fig_gray = alt.Chart(frame_src).mark_rect(stroke='#eeeeee', strokeWidth=5).encode(
    x=alt.X('X:N'),
    y=alt.Y('Y:N'),
    color=alt.Color('Intensity:N', scale=alt.Scale(domain=levels, range=palette))
)
map_fig_gray.save('test.png')

यह क्यों मायने रखता है

चार्ट अक्सर रिपोर्ट, PDF और डैशबोर्ड में एम्बेड किए जाते हैं। नोटबुक में ठीक दिखने वाला स्टाइलिंग बदलाव अगर एक्सपोर्टेड फ़ाइलों में गायब हो जाए, तो पठनीयता और स्थिरता प्रभावित होती है। वैध रंग निर्दिष्टियों का उपयोग इस असंगति को रोकता है और आपकी विज़ुअलाइज़ेशन को अलग-अलग वातावरण और फ़ॉर्मैट में भरोसेमंद बनाए रखता है।

मुख्य निष्कर्ष

यदि Altair एक्सपोर्ट में बॉर्डर गायब हो जाते हैं या असंगत दिखते हैं, तो सबसे पहले अपने रंग मान जाँचें। w जैसे शॉर्टहैंड से बचें और वैध HTML रंग नाम या हेक्स कोड अपनाएँ। stroke='white' या हल्का stroke='#eeeeee' जैसे सरल बदलाव से सेव की गई इमेज Jupyter में दिखने वाले परिणाम से मेल खाएँगी।

यह लेख StackOverflow के प्रश्न (लेखक: Yuli) और Wayne के उत्तर पर आधारित है।