केवल प्रतिशत मूल्यों और आउटलाइजर्स (यदि कोई हो) का उपयोग करके बॉक्स प्लॉट खींचने के लिए मैंने customized_box_plot
फ़ंक्शन बनाया है जो मूल रूप से मूल बॉक्स प्लॉट (छोटे नमूना डेटा से उत्पन्न) में विशेषताओं को संशोधित करता है ताकि यह आपके अनुसार फिट हो सके प्रतिशत मूल्य
customized_box_plot
समारोह
def customized_box_plot(percentiles, axes, redraw = True, *args, **kwargs):
"""
Generates a customized boxplot based on the given percentile values
"""
box_plot = axes.boxplot([[-9, -4, 2, 4, 9],]*n_box, *args, **kwargs)
# Creates len(percentiles) no of box plots
min_y, max_y = float('inf'), -float('inf')
for box_no, (q1_start,
q2_start,
q3_start,
q4_start,
q4_end,
fliers_xy) in enumerate(percentiles):
# Lower cap
box_plot['caps'][2*box_no].set_ydata([q1_start, q1_start])
# xdata is determined by the width of the box plot
# Lower whiskers
box_plot['whiskers'][2*box_no].set_ydata([q1_start, q2_start])
# Higher cap
box_plot['caps'][2*box_no + 1].set_ydata([q4_end, q4_end])
# Higher whiskers
box_plot['whiskers'][2*box_no + 1].set_ydata([q4_start, q4_end])
# Box
box_plot['boxes'][box_no].set_ydata([q2_start,
q2_start,
q4_start,
q4_start,
q2_start])
# Median
box_plot['medians'][box_no].set_ydata([q3_start, q3_start])
# Outliers
if fliers_xy is not None and len(fliers_xy[0]) != 0:
# If outliers exist
box_plot['fliers'][box_no].set(xdata = fliers_xy[0],
ydata = fliers_xy[1])
min_y = min(q1_start, min_y, fliers_xy[1].min())
max_y = max(q4_end, max_y, fliers_xy[1].max())
else:
min_y = min(q1_start, min_y)
max_y = max(q4_end, max_y)
# The y axis is rescaled to fit the new box plot completely with 10%
# of the maximum value at both ends
axes.set_ylim([min_y*1.1, max_y*1.1])
# If redraw is set to true, the canvas is updated.
if redraw:
ax.figure.canvas.draw()
return box_plot
उपयोग
उलटा तर्क (अंत में कोड) का उपयोग करते हुए मैं इस example
>>> percentiles
(-1.0597368367634488, 0.3977683984966961, 1.0298955252405229, 1.6693981537742526, 3.4951447843464449)
(-0.90494930553559483, 0.36916539612108634, 1.0303658700697103, 1.6874542731392828, 3.4951447843464449)
(0.13744105279440233, 1.3300645202649739, 2.6131540656339483, 4.8763411136047647, 9.5751914834437937)
(0.22786243898199182, 1.4120860286080519, 2.637650402506837, 4.9067126578493259, 9.4660357513550899)
(0.0064696168078617741, 0.30586770128093388, 0.70774153557312702, 1.5241965711101928, 3.3092932063051976)
(0.007009744579241136, 0.28627373934008982, 0.66039691869500572, 1.4772725266672091, 3.221716765477217)
(-2.2621660374110544, 5.1901313713883352, 7.7178532139979357, 11.277744848353247, 20.155971739152388)
(-2.2621660374110544, 5.1884411864079532, 7.3357079047721054, 10.792299385806913, 18.842012119715388)
(2.5417888074435702, 5.885996170695587, 7.7271286220368598, 8.9207423361593179, 10.846938621419374)
(2.5971767318505856, 5.753551925927133, 7.6569980004033464, 8.8161056254143233, 10.846938621419374)
नोट प्रतिशतक मान निकाला कि इस छोटे से रखने के लिए मैंने ओ नहीं दिखाया है utliers वैक्टर जो प्रत्येक प्रतिशत सरणी का 6 वां तत्व होगा।
भी ध्यान रखें कि सभी सामान्य अतिरिक्त kwargs/आर्ग के बाद से वे बस इसके अंदर boxplot
विधि करने के लिए पारित कर रहे हैं इस्तेमाल किया जा सकता:
boxplot
विधि
>>> fig, ax = plt.subplots()
>>> b = customized_box_plot(percentiles, ax, redraw=True, notch=0, sym='+', vert=1, whis=1.5)
>>> plt.show()
व्याख्या व्यक्तिगत matplotlib.lines.Line2D
उदाहरणों के लिए बॉक्सप्लॉट के घटकों को मैपिंग करने वाला एक शब्दकोश देता है बनाये गये।
matplotlib.pyplot.boxplot
प्रलेखन से हवाला देते हुए:
शब्दकोश निम्नलिखित कुंजी (ऊर्ध्वाधर boxplots कल्पना करते हुए) है कि:
बक्से: चतुर्थकों और मंझला के विश्वास के अंतराल दिखा boxplot के मुख्य शरीर सक्षम करता है, तो ।
औसत: प्रत्येक बॉक्स के औसत पर क्षैतिज रेखाएं।
व्हिस्कर्स: सबसे चरम, एन-बाहरी डेटा बिंदुओं तक विस्तारित लंबवत रेखाएं। कैप्स: व्हिस्कर्स के सिरों पर क्षैतिज रेखाएं।
फ्लायर: डेटा का प्रतिनिधित्व करने वाले बिंदु जो व्हिस्कर्स (आउटलायर) से आगे बढ़ते हैं।
का अर्थ है: साधनों का प्रतिनिधित्व करने वाले बिंदु या रेखाएं।
उदाहरण के लिए निरीक्षण [-9, -4, 2, 4, 9]
>>> b = ax.boxplot([[-9, -4, 2, 4, 9],])
>>> b
{'boxes': [<matplotlib.lines.Line2D at 0x7fe1f5b21350>],
'caps': [<matplotlib.lines.Line2D at 0x7fe1f54d4e50>,
<matplotlib.lines.Line2D at 0x7fe1f54d0e50>],
'fliers': [<matplotlib.lines.Line2D at 0x7fe1f5b317d0>],
'means': [],
'medians': [<matplotlib.lines.Line2D at 0x7fe1f63549d0>],
'whiskers': [<matplotlib.lines.Line2D at 0x7fe1f5b22e10>,
<matplotlib.lines.Line2D at 0x7fe20c54a510>]}
>>> plt.show()
के एक छोटे नमूना डेटा की boxplot
matplotlib.lines.Line2D
वस्तुओं दो विधियों है कि मैं अपने समारोह में बड़े पैमाने पर उपयोग किया जाएगा है। set_xdata
(या set_ydata
) और get_xdata
(या get_ydata
)।
इन विधियों का उपयोग करके हम बेस बॉक्स प्लॉट की घटक पंक्तियों की स्थिति को अपने प्रतिशत मूल्यों के अनुरूप बदल सकते हैं (जो customized_box_plot
फ़ंक्शन करता है)। घटक लाइनों की स्थिति में फेरबदल के बाद, आप कैनवास विभिन्न Line2D
वस्तुओं के निर्देशांक के लिए प्रतिशतक से मैपिंग का सारांश figure.canvas.draw()
का उपयोग कर पुनः बनाने कर सकते हैं।
वाई निर्देशांक:
- अधिकतम (
q4_end
- 4 चतुर्थक के अंत में) शीर्ष सबसे टोपी Line2D
वस्तु से मेल खाती है।
- न्यूनतम (
q1_start
- पहली तिमाही की शुरुआत) निम्नतम Line2D
ऑब्जेक्ट की निम्नतम सीमा से मेल खाती है।
- औसत मध्य (
q3_start
) औसत Line2D
ऑब्जेक्ट से मेल खाता है।
- 2 मूंछ बक्से के समाप्त होता है और चरम टोपियां के बीच झूठ (
q1_start
और q2_start
- कम गलमुच्छा; q4_start
और q4_end
- ऊपरी गलमुच्छा)
- बॉक्स वास्तव में एक दिलचस्प
n
आकार कम से कम एक टोपी से घिरा रेखा है हिस्से। n
आकार की रेखा के चरम q2_start
और q4_start
से मेल खाते हैं।
एक्स निर्देशांक:
- सेंट्रल x निर्देशांक (एकाधिक बॉक्स भूखंडों के लिए आम तौर पर कर रहे हैं 1, 2, 3 ...)
- पुस्तकालय स्वचालित रूप से सीमांकन एक्स के आधार पर निर्देशांक की गणना करता है चौड़ाई निर्दिष्ट।
व्युत्क्रम समारोह boxplot dict से प्रतिशतक पुनः प्राप्त करने के:
def get_percentiles_from_box_plots(bp):
percentiles = []
for i in range(len(bp['boxes'])):
percentiles.append((bp['caps'][2*i].get_ydata()[0],
bp['boxes'][i].get_ydata()[0],
bp['medians'][i].get_ydata()[0],
bp['boxes'][i].get_ydata()[2],
bp['caps'][2*i + 1].get_ydata()[0],
(bp['fliers'][i].get_xdata(),
bp['fliers'][i].get_ydata())))
return percentiles
नोट: कारण है कि मैं एक पूरी तरह से कस्टम boxplot विधि है, क्योंकि वहाँ कई इनबिल्ट द्वारा की पेशकश की विशेषताएं हैं नहीं किया बॉक्स प्लॉट जिसे पूरी तरह से पुन: उत्पन्न नहीं किया जा सकता है।
मुझे क्षमा करें अगर मैंने अनावश्यक रूप से कुछ ऐसा समझाया हो जो शायद स्पष्ट हो।
Su झुकाव: क्या आप कृपया समस्या को संक्षेप में बना सकते हैं? यही है, 'विलंबता' कहने के बजाय कुछ अमूर्तता का उपयोग करें। 'मैंने कुछ वास्तविक मूल्यों को माप लिया है यानी फ्लोटिंग पॉइंट्स, और मैं प्रतिशत गणना करना चाहता हूं ...'। – polarise