2025, Oct 18 17:31
plotnine में डिस्क्रीट अक्ष का क्रम नियंत्रित करें: polars unpivot के बाद सही बार चार्ट
polars unpivot के बाद plotnine बार चार्ट में Category क्रम उलट-पुलट हो सकता है; scale_x_discrete के limits देकर डिस्क्रीट अक्ष का सही क्रम सुनिश्चित करें, उदाहरण सहित।
विच्छिन्न श्रेणियों का क्रम गलत हो जाए तो अन्यथा स्पष्ट दिखने वाला चार्ट भी बिगड़ सकता है। polars से डेटा को reshape करते और plotnine से प्लॉट बनाते समय एक आम समस्या यह है कि Category लेबल उलट-पुलट हो जाते हैं। नीचे जैसे बार चार्ट में 5-10 वाला बकेट तीसरी पोजिशन पर होना चाहिए, लेकिन नहीं आता। जैसे ही आप डिस्क्रीट अक्ष का क्रम स्पष्ट रूप से नियंत्रित करते हैं, समाधान आसान हो जाता है।
पुनरुत्पादन: polars + plotnine बार चार्ट, जिसमें श्रेणियों का क्रम गलत है
import polars as po
import polars.selectors as sl
from plotnine import ggplot, geom_bar, aes, scale_fill_manual, coord_flip
frame_wide = po.read_csv('https://raw.githubusercontent.com/Brinkhuis/Zorguitgaven/refs/heads/master/zorguitgaven.csv')
frame_long = frame_wide.unpivot(sl.numeric(), index='Category')
(
    ggplot() +
    geom_bar(
        data=frame_long.filter(po.col('variable').is_in(['Mannen 2040', 'Vrouwen 2040'])),
        mapping=aes(x='Category', y='value', fill='variable'),
        stat='identity'
    ) +
    scale_fill_manual(values=['#007BC7', '#CA005D']) +
    coord_flip()
)
प्लॉट बन तो जाता है, लेकिन Category का क्रम उम्मीद के मुताबिक नहीं होता, और 5-10 अपनी तय जगह पर नहीं आता।
क्रम गलत क्यों हो जाता है
unpivot के बाद Category कॉलम, melt किए गए हर संख्यात्मक कॉलम के लिए वही लेबल दोहराता है। प्लॉटिंग लेयर एक ही श्रेणी के कई रूप देखती है और ऐसा क्रम चुन लेती है जो इच्छित अनुक्रम से मेल नहीं खाता। इसे ठीक करने के लिए अक्ष का क्रम स्पष्ट रूप से देना जरूरी है।
सीधा समाधान plotnine में: डिस्क्रीट limits सेट करें
x-अक्ष का क्रम लागू करने का सबसे आसान तरीका है scale_x_discrete को श्रेणियों की क्रमबद्ध सूची पास करना। यह सूची इच्छित अनुक्रम दर्शाए। एक तेज़, व्यावहारिक उपाय है long तालिका से Category मानों का पहला ब्लॉक लेना और अपेक्षित लंबाई तक slice करना।
import polars as po
import polars.selectors as sl
from plotnine import ggplot, geom_bar, aes, scale_fill_manual, scale_x_discrete, coord_flip
wide_tbl = po.read_csv('https://raw.githubusercontent.com/Brinkhuis/Zorguitgaven/refs/heads/master/zorguitgaven.csv')
long_tbl = wide_tbl.unpivot(sl.numeric(), index='Category')
(
    ggplot() +
    geom_bar(
        data=long_tbl.filter(po.col('variable').is_in(['Mannen 2040', 'Vrouwen 2040'])),
        mapping=aes(x='Category', y='value', fill='variable'),
        stat='identity'
    ) +
    scale_x_discrete(limits=long_tbl['Category'].to_list()[:21]) +
    scale_fill_manual(values=['#007BC7', '#CA005D']) +
    coord_flip()
)
यह slice, reshape के बाद Category में आने वाले डुप्लिकेट्स से बचने में मदद करता है।
और साफ़ तरीका: unpivot से पहले श्रेणियों का क्रम कैप्चर करें
स्लाइसिंग से बचने के लिए, पहले wide डेटा से Category का अद्वितीय अनुक्रम निकालें, फिर unpivot करें और उसी अनुक्रम को scale limits में दें। इससे डिस्क्रीट क्रम स्पष्ट रहता है और मूल डेटा से जुड़ा रहता है।
import polars as po
import polars.selectors as sl
from plotnine import ggplot, geom_bar, aes, scale_fill_manual, scale_x_discrete, coord_flip
source_df = po.read_csv('https://raw.githubusercontent.com/Brinkhuis/Zorguitgaven/refs/heads/master/zorguitgaven.csv')
cat_order = source_df['Category']
reshaped_df = source_df.unpivot(sl.numeric(), index='Category')
(
    ggplot() +
    geom_bar(
        data=reshaped_df.filter(po.col('variable').is_in(['Mannen 2040', 'Vrouwen 2040'])),
        mapping=aes(x='Category', y='value', fill='variable'),
        stat='identity'
    ) +
    scale_x_discrete(limits=cat_order) +
    scale_fill_manual(values=['#007BC7', '#CA005D']) +
    coord_flip()
)
यह मानते हुए कि शुरुआती डेटा फ्रेम में वे सही क्रम में हैं। वरना आपको किसी मानदंड के आधार पर उन्हें sort करना होगा — जैसे पहली संख्या पढ़कर।
यह बारीकी क्यों अहम है
विच्छिन्न श्रेणियों का क्रम अर्थपूर्ण होता है। उम्र-बैंड, कोहोर्ट्स या क्रमबद्ध बकेट्स में, गड़बड़ अक्ष व्याख्या बिगाड़ देता है, तुलना कठिन बनाता है और गलत निष्कर्षों की गुंजाइश छोड़ देता है। डेटा reshape होने पर डुप्लिकेट्स स्वाभाविक क्रम को धुंधला कर सकते हैं, जब तक प्लॉटिंग लेयर को यह न बताया जाए कि श्रेणियाँ कैसे सजानी हैं। डिस्क्रीट स्केल पर नियंत्रण रखने से चुपचाप होने वाले reordering से बचाव होता है और आपका बार चार्ट स्रोत के प्रति ईमानदार रहता है।
निष्कर्ष
polars और plotnine के साथ काम करते हुए, unpivot जैसी reshape प्रक्रियाएँ श्रेणी लेबलों को डुप्लिकेट कर सकती हैं और डिस्क्रीट अक्षों पर अप्रत्याशित क्रम ला सकती हैं। श्रेणियों को इच्छित अनुक्रम में बनाए रखने का भरोसेमंद तरीका है scale_x_discrete को स्पष्ट limits देना। unpivot से पहले Category सीरीज़ ले लेने से साफ़, अद्वितीय क्रम मिलता है; उसी अनुक्रम को स्केल में देने से चार्ट बिल्कुल वैसा रेंडर होता है जैसा डिज़ाइन किया गया है।