Python Matplotlib繪制箱線圖的全過程
箱線圖介紹
箱線圖(Box-plot)又稱為盒式圖或箱型圖,是一種用來顯示一組數(shù)據(jù)分散情況的統(tǒng)計(jì)圖,它能顯示一組數(shù)據(jù)的上界、下界、中位數(shù)、上下四分位數(shù)以及異常值等。箱線圖的各部分組成及其含義如下圖所示。
關(guān)鍵術(shù)語說明 四分位數(shù):
- 四分位數(shù):就是把一組數(shù)據(jù)按照從小到大的順序進(jìn)行排列,然后分成四等份,處于三個(gè)分割點(diǎn)位置的數(shù)字就是四分位數(shù);
- 第一四分位數(shù)(q1):又稱“較小四分位數(shù)”或“下四分位數(shù)”,等于該樣本中所有數(shù)值由小到大排列后第25%的數(shù)字,q1的位置 = 1+(n-1)x 0.25;
- 第二四分位數(shù)(q2):又稱“中位數(shù)”,等于該樣本中所有數(shù)值由小到大排列后第50%的數(shù)字,q2的位置= 1+(n-1)x 0.5;
- 第三四分位數(shù)(q3),又稱“較大四分位數(shù)”或“上四分位數(shù)”,等于該樣本中所有數(shù)值由小到大排列后第75%的數(shù)字。q3的位置= 1+(n-1)x 0.75;
- 四分位間距(InterQuartile Range,IQR):第三四分位數(shù)與第一四分位數(shù)的差距(q3數(shù)據(jù)- q1數(shù)據(jù));
- Whiske上限(大于該值即為異常值):q3數(shù) + 1.5*IQR,(1.5表示超過的比例,是一個(gè)系數(shù),可根據(jù)實(shí)際情況調(diào)整);
- Whisker下限(小于該值即為異常值):q1數(shù) - 1.5*IQR。
首先對(duì)這組數(shù)據(jù)進(jìn)行排序得到:[12, 30, 36, 40, 45, 50, 80],數(shù)組長(zhǎng)度n為7;
q1的位置 = 1+(n-1)x 0.25=1 + 6*0.25 =2.5,所以q1的值為:30 + (36 - 30)*0.5 = 33
q2的位置 = 1+(n-1)x 0.5=1 + 6*0.5 =4,所以q2的值為40
q3的位置 = 1+(n-1)x 0.75=1 + 6*0.75 =5.5,所以q3的值為:45 + (50 - 45)*0.5=47.5
例2:一組數(shù)據(jù)[12, 45, 30, 80, 36, 50, 40, 43],分別求出q1、q2、q3
首先對(duì)這組數(shù)據(jù)進(jìn)行排序得到:[12, 30, 36, 40, 43, 45, 50, 80],數(shù)組長(zhǎng)度n為8;
q1的位置 = 1+(n-1)x 0.25=1 + 7*0.25 =2.75,所以q1的值為:30 + (36 - 30)*0.75 = 34.5
q2的位置 = 1+(n-1)x 0.5=1 + 7*0.5 =4.5,所以q2的值為40 + (43-40)*0.5=41.5
q3的位置 = 1+(n-1)x 0.75=1 + 7*0.75 =6.25,所以q3的值為:45 + (50 - 45)*0.25=46.25
在numpy中提供了quantile()函數(shù),可以直接獲取四分位數(shù),例如np.quantile(x, 0.25)即可獲取數(shù)組x中的q1值。
Matplotlib中繪制箱線圖的方法:boxplot
boxplot( x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, bootstrap=None, usermedians=None, conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None, manage_ticks=True, autorange=False, zorder=None, *, data=None):
關(guān)鍵參數(shù)含義說明如下:
- x:指定要繪制箱線圖的數(shù)據(jù),可以是一組數(shù)據(jù)也可以是多組數(shù)據(jù);
- notch:是否以凹口的形式展現(xiàn)箱線圖,默認(rèn)非凹口;
- sym:指定異常點(diǎn)的形狀,默認(rèn)為藍(lán)色的+號(hào)顯示;
- vert:是否需要將箱線圖垂直擺放,默認(rèn)垂直擺放;
- whis:指定上下須與上下四分位的距離,默認(rèn)為1.5倍的四分位差;
- positions:指定箱線圖的位置,默認(rèn)為range(1, N+1),N為箱線圖的數(shù)量;
- widths:指定箱線圖的寬度,默認(rèn)為0.5;
- patch_artist:是否填充箱體的顏色,默認(rèn)為False;
- meanline:是否用線的形式表示均值,默認(rèn)用點(diǎn)來表示;
- showmeans:是否顯示均值,默認(rèn)不顯示;
- showcaps:是否顯示箱線圖頂端和末端的兩條線,默認(rèn)顯示;
- showbox:是否顯示箱線圖的箱體,默認(rèn)顯示;
- showfliers:是否顯示異常值,默認(rèn)顯示;
- boxprops:設(shè)置箱體的屬性,如邊框色,填充色等;
- labels:為箱線圖添加標(biāo)簽,類似于圖例的作用;
- filerprops:設(shè)置異常值的屬性,如異常點(diǎn)的形狀、大小、填充色等;
- medianprops:設(shè)置中位數(shù)的屬性,如線的類型、粗細(xì)等;
- meanprops:設(shè)置均值的屬性,如點(diǎn)的大小、顏色等;
- capprops:設(shè)置箱線圖頂端和末端線條的屬性,如顏色、粗細(xì)等;
- whiskerprops:設(shè)置須的屬性,如顏色、粗細(xì)、線的類型等;
- manage_ticks:是否自適應(yīng)標(biāo)簽位置,默認(rèn)為True;
- autorange:是否自動(dòng)調(diào)整范圍,默認(rèn)為False;
程序舉例
(1)繪制單個(gè)箱線圖
import matplotlib.pyplot as plt import numpy as np x = np.array([12, 45, 30, 70, 36, 50, 40, 26, 38]) print(sorted(x)) a = np.quantile(x, 0.75) # 上四分之一數(shù) b = np.quantile(x, 0.25) # 下四分之一數(shù) print("平均數(shù):", np.mean(x)) # 打印均值 print("中位數(shù):", np.median(x)) # 打印中位數(shù) print("上四分之一數(shù):", a) # 打印上四分之一數(shù) print("下四分之一數(shù):", b) # 打印下四分之一數(shù) up = a + 1.5 * (a - b) # 異常值判斷標(biāo)準(zhǔn) down = b - 1.5 * (a - b) # 異常值判斷標(biāo)準(zhǔn) x = np.sort(x) # 對(duì)原始數(shù)據(jù)排序 shangjie = x[x < up][-1] # 除了異常值外的最大值 xiajie = x[x > down][0] # 除了異常值外的最小值 print("上界:", shangjie) # 打印上界 print("up:", up) print("down:", down) print("下界:", xiajie) # 打印下界 plt.grid(True) # 顯示網(wǎng)格 y = plt.boxplot(x, meanline=True, showmeans=True, flierprops={"marker": "o", "markerfacecolor": "red", "markersize": 15}) # 繪制箱形圖,設(shè)置異常點(diǎn)大小、樣式等 plt.show() # 顯示圖
程序執(zhí)行效果圖:
控制臺(tái)輸出結(jié)果為:
[12, 26, 30, 36, 38, 40, 45, 50, 70]
平均數(shù): 38.55555555555556
中位數(shù): 38.0
上四分之一數(shù): 45.0
下四分之一數(shù): 30.0
上界: 50
up: 67.5
down: 7.5
下界: 12
(2)繪制多個(gè)箱線圖
import matplotlib.pyplot as plt import numpy as np x = np.random.randint(10, 100, size=(5, 9)) # 隨機(jī)生成5行9列 [10, 100]之間的數(shù) print(x) # 打印數(shù)據(jù) plt.grid(True) # 顯示網(wǎng)格 plt.boxplot(x, labels=list("ABCDEFGHI"), sym="r+", showmeans=True) # 繪制箱線圖 plt.show() # 顯示圖片
程序執(zhí)行效果圖:
注:圖中紅色+號(hào)表示異常點(diǎn),綠色三角形表示平均數(shù)。
控制臺(tái)輸出的打印結(jié)果為:
更多Python[[90 99 35 32 21 31 83 71 39]
[24 95 63 50 92 41 89 16 79]
[73 73 53 21 39 60 50 55 43]
[64 94 66 26 20 73 40 68 45]
[74 72 33 81 73 59 85 23 17]]
總結(jié)
到此這篇關(guān)于Python Matplotlib繪制箱線圖的文章就介紹到這了,更多相關(guān)Matplotlib繪制箱線圖內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。