मैं निम्नलिखित बॉक्सप्लॉट में व्हिस्कर लाइनों को व्यापक बनाना चाहता हूं।

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.DataFrame({'Data': np.random.random(100), 'Type':['Category']*100})

fig, ax = plt.subplots()

# Plot boxplot setting the whiskers to the 5th and 95th percentiles
sns.boxplot(x='Type', y='Data', data=data, color = 'gray', whis = [5,95])

# Adjust boxplot and whisker line properties
for p, artist in enumerate(ax.artists):
    artist.set_edgecolor('blue')
    for q in range(p*6, p*6+6):
        line = ax.lines[q]
        line.set_color('pink')

enter image description here

मैं जानता हूं कि मूंछ के रंग और लिनिविथ को कैसे समायोजित किया जाए, लेकिन मैं यह पता नहीं लगा पाया कि मूंछों की लंबाई कैसे बढ़ाई जाए। मैं सबसे करीब आया हूं line.set_xdata([q/60-0.5, q/60+0.5]) का उपयोग करने की कोशिश कर रहा हूं लेकिन मुझे त्रुटि मिलती है

ValueError: shape mismatch: objects cannot be broadcast to a single shape    

आदर्श रूप से, मैं चाहता हूं कि व्हिस्कर शतमक रेखाएं बॉक्स के समान चौड़ाई की हों। मैं यह कैसे कर सकता हूँ?

3
HS-nebula 25 अप्रैल 2019, 16:56

1 उत्तर

सबसे बढ़िया उत्तर

जैसा कि आपने देखा है, प्रत्येक बॉक्स के लिए ६ लाइनें प्लॉट की गई हैं (इसलिए आपकी p*6 अनुक्रमणिका)।

इंडेक्स p*6+4 वाली लाइन में बॉक्स की चौड़ाई होती है (जो कि बॉक्स के अंदर की मीडियन लाइन है)। तो हम इसका उपयोग अन्य लाइनों की चौड़ाई निर्धारित करने के लिए कर सकते हैं।

जिन पंक्तियों को आप बदलना चाहते हैं, उनका सूचकांक p*6+2 और p*6+3 है।

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.DataFrame({'Data': np.random.random(100), 'Type':['Category']*100})

fig, ax = plt.subplots()

# Plot boxplot setting the whiskers to the 5th and 95th percentiles
sns.boxplot(x='Type', y='Data', data=data, color = 'gray', whis = [5,95])

# Adjust boxplot and whisker line properties
for p, artist in enumerate(ax.artists):
    artist.set_edgecolor('blue')
    for q in range(p*6, p*6+6):
        line = ax.lines[q]
        line.set_color('pink')

    ax.lines[p*6+2].set_xdata(ax.lines[p*6+4].get_xdata())
    ax.lines[p*6+3].set_xdata(ax.lines[p*6+4].get_xdata())

enter image description here

यह कई बक्से के साथ एक उदाहरण के साथ भी काम करता है:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

sns.set(style="whitegrid")
tips = sns.load_dataset("tips")
ax = sns.boxplot(x="day", y="total_bill", data=tips)

# Adjust boxplot and whisker line properties
for p, artist in enumerate(ax.artists):
    artist.set_edgecolor('blue')
    for q in range(p*6, p*6+6):
        line = ax.lines[q]
        line.set_color('pink')

    ax.lines[p*6+2].set_xdata(ax.lines[p*6+4].get_xdata())
    ax.lines[p*6+3].set_xdata(ax.lines[p*6+4].get_xdata())

enter image description here

4
tmdavison 25 अप्रैल 2019, 14:27