2015-02-15 6 views
5

मैं plt.boxplot() कमांड का उपयोग कर मानक Matplotlib बॉक्सप्लॉट बना रहा हूं। कोड कि boxplot बनाता है की मेरी लाइन है:मैटलप्लिब बॉक्सप्लॉट केवल अधिकतम और न्यूनतम फ्लायर दिखाता है

bp = plt.boxplot(data, whis=[5, 95], showfliers=True) 

क्योंकि मेरे डेटा एक बड़ी वितरण है, मैं मूंछ की श्रेणी से बाहर फ़्लायर का एक बहुत हो रही है। एक क्लीनर प्रकाशन गुणवत्ता साजिश प्राप्त करने के लिए, मैं केवल अधिकतम पर एकल फ्लायर दिखाना चाहता हूं। और मिनट में। सभी fliers के बजाय, डेटा के मूल्य। क्या यह संभव है? मुझे ऐसा करने के लिए प्रलेखन में कोई भी अंतर्निहित विकल्प नहीं दिख रहा है।

(मैं व्हिस्कर की सीमा अधिकतम/मिनट तक सेट कर सकता हूं, लेकिन यह वही नहीं है जो मैं चाहता हूं। मैं 5 वें और 95 वें प्रतिशत पर व्हिस्कर्स रखना चाहता हूं)।

नीचे वह आंकड़ा है जिस पर मैं काम कर रहा हूं। फ्लायर की घनत्व पर ध्यान दें। Boxplots

+0

फ़्लायर की कि घनत्व महत्वपूर्ण जानकारी नहीं है? – tacaswell

+0

हां, निश्चित रूप से है। मुझे लगता है कि आप जो दिखाने की कोशिश कर रहे हैं उस पर निर्भर करता है। लेकिन आप एक अच्छा मुद्दा बनाते हैं। – PJW

उत्तर

3

plt.boxplot() एक शब्दकोश है, जहां कुंजी fliers line2d वस्तुओं के रूप में ऊपरी और निचले फ़्लायर शामिल देता है। आप उन्हें इस तरह की साजिश रचने से पहले हेरफेर कर सकते हैं:

केवल matplotlib पर> = 1.4.0

bp = plt.boxplot(data, whis=[5, 95], showfliers=True) 

# Get a list of Line2D objects, representing a single line from the 
# minimum to the maximum flier points. 
fliers = bp['fliers'] 

# Iterate over it! 
for fly in fliers: 
    fdata = fly.get_data() 
    fly.set_data([fdata[0][0],fdata[0][-1]],[fdata[1][0],fdata[1][-1]]) 

पुराने संस्करणों

आप matplotlib के एक पुराने संस्करण पर हैं, पर प्रत्येक बॉक्सप्लॉट के लिए फ्लायर दो लाइनों द्वारा दर्शाए जाते हैं, एक नहीं। इस प्रकार, पाश कुछ इस तरह दिखेगा:

import numpy as np 
for i in range(len(fliers)): 
    fdata = fliers[i].get_data() 
    # Get the index of the maximum y in data if 
    # i is 0 or even, else get index of minimum y. 
    if i%2 == 0: 
     id = np.where(fdata[1] == fdata[1].max())[0][0] 
    else: 
     id = np.where(fdata[1] == fdata[1].min())[0][0] 
    fliers[i].set_data([fdata[0][id], fdata[1][id]]) 

भी ध्यान रखें कि showfliers तर्क matplotlib में < 1.4x मौजूद नहीं है और whisk तर्क सूचियों को स्वीकार नहीं करता है।

कोर्स (सरल अनुप्रयोगों के लिए) के

आप फ़्लायर बिना boxplot साजिश और साजिश करने के लिए अधिकतम और न्यूनतम अंक जोड़ सकते हैं:

bp = plt.boxplot(data, whis=[5, 95], showfliers=False) 
sc = plt.scatter([1, 1], [data.min(), data.max()]) 

जहां [1, 1] अंकों की एक्स स्थिति है।

+0

आपका पहला समाधान सभी अधिकतम फ्लायर बस ठीक है, लेकिन न्यूनतम नहीं। यदि मैं कोड में अधिकतम के लिए न्यूनतम में छोटा हूं, तो बस mins plot। शायद मुझे कुछ याद आ रहा है, लेकिन मैं प्लॉट करने के लिए अधिकतम और मिनट दोनों कैसे प्राप्त करूं? दूसरा सुझाया गया समाधान काम नहीं करता है .... बक्से के नीचे कुछ बिंदु प्लॉट करता है, लेकिन वे मिनट नहीं हैं। और तीसरा सुझाया गया समाधान मेरे लिए काम नहीं करेगा, क्योंकि 'डेटा' वास्तव में कई पांडो डेटाफ्रेम की एक सूची है (पोस्ट किए गए आंकड़े के रूप में एकाधिक बॉक्सप्लॉट का उत्पादन)। हालांकि आपके उत्तर के लिए धन्यवाद, मुझे लगता है कि यह बहुत करीब है! – PJW

+0

क्षमा करें, कल बहुत देर हो चुकी थी। मैंने इसे ऊपर तय किया। उम्मीद है कि यह उचित रूप से स्पष्ट और पालन करने में आसान है। दूसरा सुझाव भी लिया। – Geotob

+0

अब, न्यूनतम और अधिकतम वैकल्पिक, जैसे कि बॉक्स 1 केवल अधिकतम दिखाता है, बॉक्स 2 केवल मिनट दिखाता है, बॉक्स 3 केवल अधिकतम दिखाता है ...... ?? ऊपर जो चित्र जोड़ा गया है उसे देखें। – PJW

1
fliers = bp['fliers'] 
for i in range(len(fliers)): # iterate through the Line2D objects for the fliers for each boxplot 
    box = fliers[i] # this accesses the x and y vectors for the fliers for each box 
    box.set_data([[box.get_xdata()[0],box.get_xdata()[0]],[np.min(box.get_ydata()),‌​np.max(box.get_ydata())]]) 
    # note that you can use any two values from the xdata vector 

आंकड़ा परिणामस्वरूप, केवल अधिकतम और न्यूनतम फ़्लायर दिखा: enter image description here

संबंधित मुद्दे