2025, Oct 19 17:31
Altair में CDF एरिया चार्ट टूटता क्यों दिखता है और इसे कैसे ठीक करें
Altair में transform_quantile से बने CDF एरिया चार्ट में टूटे बहुभुज की वजह समझें: duplicate x पर stacking; y2, aggregate और step size से स्मूथ, सटीक CDF पाएं.
CDF को दर्शाने के लिए एरिया चार्ट स्वाभाविक विकल्प हैं, क्योंकि वक्र मोनोटोनिक रूप से बढ़ता होना चाहिए और उसके नीचे का क्षेत्र नज़र को स्थिर संदर्भ देता है। फिर भी, Altair में transform_quantile के जरिए CDF बनाते समय अक्सर अजीब बहुभुज और टूटी-फूटी फिल दिख जाती हैं। वजह CDF का गणित नहीं, बल्कि क्वांटाइल ट्रांसफॉर्म के बाद दोहराए गए x मानों को area मार्क जिस तरह संभालता है, वही है।
न्यूनतम सेटअप जो गलत दिखता है
नीचे दिया स्निपेट थोड़े से outcomes से क्वांटाइल निकालता है और उन्हें एरिया चार्ट के रूप में रेंडर करने की कोशिश करता है।
import altair as alt
import polars as pl
df_src = pl.DataFrame({"outcomes": [16950, 17050, 18750, 18750, 20950]})
(
    alt.Chart(df_src)
    .transform_quantile("outcomes", step=0.1)
    .mark_area(line=True, opacity=0.5)
    .encode(
        x=alt.X("value:Q"),
        y=alt.Y("prob:Q").title("Prob"),
    )
)
असल में होता क्या है
चुने गए step के मुकाबले इनपुट मान कम हों तो quantile transform कई ऐसी probabilities बनाता है जो एक ही value पर मैप होती हैं। इसे Vega Editor में मध्यवर्ती डेटा देखकर परखा जा सकता है; जैसे 0.55, 0.65 और 0.75 जैसी probabilities एक ही value साझा कर सकती हैं। जब area chart को समान x निर्देशांक वाली कई पंक्तियाँ मिलती हैं, तो वह उन्हें stack करने की कोशिश करता है, और वही अप्रत्याशित ज्यामिति बनती है जो आप देख रहे हैं। अलग-अलग outcomes की संख्या बढ़ाने से अक्सर ये टकराव कम हो जाते हैं, पर अगर आपके डेटा में ties हैं तो इसकी गारंटी नहीं।
समाधान: stacking बंद करें (या transform समायोजित करें)
सबसे आसान उपाय है y चैनल पर stacking निष्क्रिय करना, ताकि दोहराए गए x स्थान एक-दूसरे पर न चढ़ें। संभव हो तो step size बढ़ाना भी एक तरीका है, जिससे कम probabilities एक ही value पर टकराएँ।
import altair as alt
import polars as pl
df_src = pl.DataFrame({"outcomes": [16950, 17050, 18750, 18750, 20950]})
(
    alt.Chart(df_src)
    .transform_quantile("outcomes", step=0.1)
    .mark_area(line=True, opacity=0.5)
    .encode(
        x=alt.X("value:Q"),
        y=alt.Y("prob:Q", stack=None).title("Prob")
    )
)
Y2 बेसलाइन और y2/Y2 API के बारे में
एरिया चार्ट में Y2 की डिफ़ॉल्ट बेसलाइन 0 होती है। लेकिन जैसे ही कई पंक्तियाँ एक ही x स्थान साझा करती हैं, renderer को तय करना पड़ता है कि y मानों को कैसे जोड़े—क्या उन्हें जोड़ दे, अधिकतम ले, या कुछ और? यही अस्पष्टता दोहराए गए x मान आने पर बहुभुज के अजीब दिखने की वजह बनती है। Stacking को बंद करना इस अस्पष्टता को हटा देता है। इसका एक और हल समेकन (aggregate) है—जैसे y चैनल पर अधिकतम probability लेना, ताकि डुप्लिकेट x स्थान एक बिंदु में सिमट जाएँ।
API उपयोग के संदर्भ में, y2 को datum बेसलाइन से सेट किया जा सकता है। स्वीकार्य रूप हैं y2=alt.Y2Datum(0) या encode में सीधे alt.Y2Datum(0) पास करना। इससे चार्ट ऊपर-ऊपर ठीक चलता हुआ लग सकता है, लेकिन बेहतर यही है कि मूल कारण पर काम किया जाए—stacking रोककर या y मानों का समेकन करके—क्योंकि समस्या का केंद्र बेसलाइन नहीं, बल्कि डुप्लिकेट x स्थान हैं।
क्यों जानना ज़रूरी है
Quantile transforms और area marks प्रभावी होते हैं, लेकिन दोनों मिलकर stacking के अर्थगत पहलू उभार देते हैं। जब x स्थान दोहरते हैं, तो area stacking एक ऐसी CDF को भी बिगाड़ सकता है, जो सामान्यतः एकरूपी बढ़ती और सरल दिखनी चाहिए। Stacking को कैसे नियंत्रित करें, और कब समेकन या step size बदलना है—यह समझ चार्ट को मूल वितरण के प्रति ईमानदार रखती है।
निष्कर्ष
अगर आपका Altair CDF एरिया चार्ट दाँतेदार या 'मुड़ा-तूटा' दिखता है, तो x अक्ष पर दोहराए गए मानों के लिए मध्यवर्ती quantile आउटपुट जाँचें। अनचाही जमाव से बचने के लिए y चैनल पर stacking बंद करें, या probabilities का समेकन करें ताकि डुप्लिकेट मान नियत तरीके से सुलझें। यदि सटीकता अनुमति दे, तो quantile step को समायोजित करने पर विचार करें। इन सुरक्षा उपायों के साथ, area मार्क वाला CDF वैसी ही बढ़ती वक्र के रूप में रेंडर होगा जैसी आप उम्मीद करते हैं।
यह लेख StackOverflow पर दिए गए एक प्रश्न (Juan Martinez द्वारा) और kgoodrick के उत्तर पर आधारित है।