2025, Oct 31 21:02

Plotly Express में grouped bar chart के x-अक्ष समूहों को एक रंग कैसे दें

Plotly Express में wide-form DataFrame से बने grouped bar chart में x-अक्ष के प्रत्येक समूह को एक ही रंग दें—update_traces और marker_color से सटीक नियंत्रण पाएं.

Plotly Express के grouped bar chart में x-अक्ष के प्रत्येक समूह को रंग दें

Plotly Express में wide-form DataFrame से grouped bar chart बनाते समय, अक्सर आप चाहते हैं कि प्रत्येक x-अक्ष समूह का एक ही रंग हो, न कि सीरीज़ के आधार पर रंग दिए जाएँ। सीधे-सादे तरीकों, जैसे रंग पैलेट तय करना, आमतौर पर ट्रेस (कॉलम) के रंग को सभी समूहों में बदल देते हैं—जो आपके “प्रति समूह एक रंग” वाले उद्देश्य से मेल नहीं खाता।

सेटअप पुन: बनाना

नीचे दिया गया उदाहरण 3×3 DataFrame से एक grouped bar chart बनाता है। रंग नियंत्रित करने के लिए प्रयुक्त discrete sequence प्रति-ट्रेस लागू होती है, इसलिए सभी समूहों में एक-सा रंग भर जाता है।

import plotly.express as px
import pandas as pd
df_ph_levels = pd.DataFrame([[8.33, 8.36, 8.36], [8.21, 8.18, 8.21], [7.50, 7.56, 7.64]], index=["4 °C", "37 °C", "37 °C + 5 % CO<sub>2"])
plot_ph = px.bar(df_ph_levels, barmode="group", color_discrete_sequence=["black"]*3)
# लेआउट समायोजन
plot_ph = plot_ph.update_layout(
    showlegend=False,
    xaxis_title_text=None,
    yaxis_title_text="pH",
    width=900,
    height=800,
    margin=dict(t=0, b=0, l=0, r=0),
    yaxis_range=(6.5, 8.6)
)
plot_ph

यह क्यों हो रहा है और समूह के हिसाब से रंग क्यों नहीं बदलते

Wide-form इनपुट में Plotly Express DataFrame की हर कॉलम के लिए एक ट्रेस बनाता है। रंग पैलेट देने वाला पैरामीटर—जैसे discrete sequence—ट्रेस के रंग नियंत्रित करता है। इसलिए आप पूरे चार्ट में पहली, दूसरी या तीसरी कॉलम का रंग बदल सकते हैं या सब कुछ एक ही रंग बना सकते हैं, लेकिन उसी तरीके से प्रत्येक x-अक्ष समूह के लिए अलग रंग सीधे सेट नहीं कर सकते।

समाधान: update_traces से बार की पोज़िशन के आधार पर रंग दें

समूह के आधार पर रंग देने के लिए, प्रत्येक ट्रेस के भीतर की बार्स को रंगों की एक ऐरे पास करें और discrete sequence हटा दें। ऐसा update_traces कॉल करके किया जाता है, जहाँ marker_color को आपकी मनचाही रंग-सूची पर सेट किया जाता है। इसके बाद हर ट्रेस प्रत्येक बार-पोज़िशन के लिए वही रंग इस्तेमाल करेगा, जिससे किसी दिए गए x-समूह की सभी बार्स एक ही रंग साझा करेंगी।

import plotly.express as px
import pandas as pd
df_ph_levels = pd.DataFrame([[8.33, 8.36, 8.36], [8.21, 8.18, 8.21], [7.50, 7.56, 7.64]], index=["4 °C", "37 °C", "37 °C + 5 % CO<sub>2"])
plot_ph = px.bar(df_ph_levels, barmode="group")
# लेआउट समायोजन
plot_ph = plot_ph.update_layout(
    showlegend=False,
    xaxis_title_text=None,
    yaxis_title_text="pH",
    width=900,
    height=800,
    margin=dict(t=0, b=0, l=0, r=0),
    yaxis_range=(6.5, 8.6)
)
# प्रत्येक x-समूह के लिए रंग निर्धारित करें
plot_ph.update_traces(marker_color=["#0C3B5D", "#EF3A4C", "#FCB94D"]) 
plot_ph.show()

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

रंग ट्रेस दर्शाएँ या समूह—यह चुनाव तय करता है कि लोग चार्ट को कैसे पढ़ेंगे। यदि आपको x-अक्ष पर हर श्रेणी को एक ब्लॉक के रूप में उभारना है, तो यह तरीका विज़ुअल मैपिंग को साफ-सुथरा रखता है और ट्रेस-स्तर पर काम करने वाली पैलेट सेटिंग्स से संघर्ष से बचाता है।

निष्कर्ष

यदि discrete पैलेट x-अक्ष समूहों के बजाय पूरी सीरीज़ के रंग बदलती रहती है, तो marker_color के साथ update_traces अपनाएँ और समूहों के लिए मनचाहे रंग दें। इसे color_discrete_sequence के साथ न मिलाएँ, ताकि आपकी प्रति-बार रंग सेटिंग ओवरराइड न हो। यह छोटा-सा बदलाव grouped bar के रंगों पर सटीक नियंत्रण देता है और चार्ट को आपका उद्देश्य साफ़-साफ़ व्यक्त करने में मदद करता है।

यह लेख StackOverflow के प्रश्न (लेखक: Václav Bočan) और strawdog के उत्तर पर आधारित है।