2025, Oct 02 07:31

Seaborn प्लॉट में कई लाइनों के साथ साफ legend कैसे रखें

Seaborn प्लॉट में भरे‑भरे legend को साफ करें: matplotlib 3.10+ में अंडरसकोर हैक के बजाय हैंडल/लेबल फ़िल्टर कर के चुनिंदा प्रविष्टियाँ दिखाएँ. कोड और स्पष्ट उदाहरण.

जब किसी Seaborn प्लॉट में कई रेखाएँ और एरर बैंड होते हैं, तो लेजेंड भरा‑भरा लग सकता है। पहले एक आम तरकीब यह थी कि अवांछित प्रविष्टियों को छिपाने के लिए matplotlib की legend कॉल में अंडरसकोर पास कर दिए जाएँ। हाल की matplotlib संस्करणों (>3.10) में यह व्यवहार हटा दिया गया है, जिससे पुराना तरीका काम नहीं करता और वे लेबल दिखने लगते हैं जिन्हें आप नहीं दिखाना चाहते।

समस्या का न्यूनतम उदाहरण

नीचे दिया गया स्निपेट एक बहु-रेखा Seaborn प्लॉट बनाता है और फिर अंडरसकोर से कुछ लेजेंड प्रविष्टियों को छिपाने की कोशिश करता है। पहले इससे लेबल दब जाते थे, लेकिन नवीनतम matplotlib में अब ऐसा नहीं होता।

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
data_tbl = pd.DataFrame({'timepoint': np.random.randint(0, 10, 1000),
      'class': np.random.choice(['cat', 'dog', 'duck', 'hare'], 1000),
      'probability': np.random.rand(1000)
})
sns.lineplot(data_tbl, x='timepoint', y='probability', hue='class')
# पहले, नाम में अंडरसकोर देने से लेबल छिप जाता था
plt.legend(['cat', *['_']*5, 'hare'])

मुद्दा क्या है

अंडरसकोर वाली तरकीब एक ऐसे पुराने व्यवहार पर निर्भर थी, जो अब मौजूद नहीं है। Seaborn के साथ आप सीधे अंतर्निहित matplotlib प्लॉट कॉल्स को नियंत्रित भी नहीं करते, इसलिए चलते‑चलते लेबल सेट करना संभव नहीं रहता। उपाय यह है कि Seaborn जो बना चुका है, उसी के साथ काम करें: अक्षों से जुड़े लेजेंड हैंडल और लेबल। जिन मदों की आपको परवाह है उन्हें चुनकर वापस legend में पास करें—आपको बिना पुरानी सुविधाओं पर निर्भर हुए एक साफ, चयनित लेजेंड मिल जाएगा।

समाधान: Seaborn द्वारा बने लेजेंड आइटम्स को फ़िल्टर करें

Seaborn के lineplot को एक वेरिएबल में रखें, बने हुए हैंडल और लेबल निकालें, जिन्‍हें रखना है उन्हें चुनें, और फ़िल्टर किए हुए सेट को legend में वापस दें। इससे आपका कोड स्पष्ट रहता है और मौजूदा matplotlib के साथ संगत भी।

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
data_tbl = pd.DataFrame({'timepoint': np.random.randint(0, 10, 1000),
      'class': np.random.choice(['cat', 'dog', 'duck', 'hare'], 1000),
      'probability': np.random.rand(1000)
})
axis_obj = sns.lineplot(data_tbl, x='timepoint', y='probability', hue='class')
# seaborn द्वारा बनाए गए सभी हैंडल/लेबल प्राप्त करें
all_handles, all_labels = axis_obj.get_legend_handles_labels()
# किन्हें रखना है, तय करें
show_only = ["cat", "hare"]
filtered_handles = [hh for hh, ll in zip(all_handles, all_labels) if ll in show_only]
filtered_labels  = [ll for ll in all_labels if ll in show_only]
axis_obj.legend(filtered_handles, filtered_labels)
plt.show()

यह क्यों अहम है

लेजेंड की स्पष्टता, प्लॉट की पठनीयता का अहम हिस्सा है—खासकर तब जब कई श्रेणियाँ और अनिश्चितता बैंड हों। हटाए गए व्यवहार पर निर्भर रहना अविश्वसनीय है; लेजेंड प्रविष्टियों को स्पष्ट रूप से फ़िल्टर करना आपकी मंशा साफ करता है और आपके प्लॉट को अलग‑अलग संस्करणों में सुसंगत बनाए रखता है। यह Seaborn की उच्च‑स्तरीय API के साथ भी बेहतर तालमेल बैठाता है, जहाँ प्लॉटिंग कॉल्स सीधे आपके नियंत्रण में नहीं रहतीं।

मुख्य बातें

पुरानी अंडरसकोर तरकीब छोड़ दें। लेजेंड को पोस्ट‑प्रोसेसिंग चरण की तरह लें: Seaborn से axes लें, हैंडल और लेबल निकालें, और केवल वही प्रविष्टियाँ वापस दें जो आप दिखाना चाहते हैं। यह छोटा बदलाव आपकी विज़ुअलाइज़ेशन पाइपलाइन को साफ, पूर्वानुमेय और भविष्य‑सुरक्षित रखता है।