目錄
- 九、箱形圖
-
- 1、plt.plot.box()
- 2、plt.boxplot()
- 3、分組繪圖
九、箱形圖
箱形圖又稱為盒須圖、盒式圖或箱線圖,它主要用于反映原始資料分布的特征,還可以進行多組資料分布特征的比較。
- 中位數:按順序排列的一組資料中居于中間位置的數
- 上四分位數Q3:一組資料排序後處于75%((1+n)/4*3)位置上的值
- 下四分位數Q1:一組資料排序後處于25%((1+n)/4)位置上的值
- 四分位距IQR=Q3-Q1
- 内限:最大值Q3+1.5IQR,最小值Q1-1.5IQR
- 外限:最大值Q3+3IQR,最小值Q1-3IQR
- 異常值:内限與外限之間,中度異常,在外限以外,極度異常
箱形圖的繪制步驟:
- 畫數軸:度量機關大小和資料批的機關一緻,起點比最小值稍小,長度比該資料批的全距稍長;
- 畫一個矩形盒:兩端分别對應資料批的上下四分位數(Q3和Q1)。在矩形盒内部中位數位置畫中位線;
- 畫内限和外限:箱型圖一般沒有标出内限和外限;
- 畫上邊緣和下邊緣:從矩形盒兩端邊向外各畫一條線段直到不是異常值的最遠點,表示該批資料正常值的分布區間;
- 用"〇"标出中度異常值,用"*"标出極度異常值;相同值的資料點并列标出在同一資料線位置上。
1、plt.plot.box()
- vert:是否垂直,預設True
- positions:占位
箱形圖着色:
- boxes:箱線的顔色
- whiskers:豎線的顔色
- medians:中位線的顔色
- caps:邊緣線的顔色
df = pd.DataFrame(np.random.rand(10, 5), columns = list("ABCDE"))
color = dict(boxes = 'DarkGreen', whiskers = 'DarkOrange', medians = 'DarkBlue', caps = 'Gray')
df.plot.box(ylim = [0, 1.2],
color = color,
positions = [1, 4, 5, 6, 8])
2、plt.boxplot()
plt.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_xticks=True, autorange=False, zorder=None, hold=None, data=None)
- x: 資料
- notch: 預設False,生成一個矩形箱形圖;如果為True,将生成一個帶缺口的箱形圖,缺口表示中位數附近的置信區間(CI)
- sym: 異常點形狀,參考marker
- vert: 是否垂直,預設True
-
whis: 預設1.5,表示上須Q3 + whis * IQR,下須Q1 - whis * IQR
設定區間如[5,95],代表強制上下邊緣為資料95%和5%位置
字元串"range",将晶須強制為資料的最小值和最大值
- positions: 占位
- patch_artist: 箱體是否進行顔色填充,預設False
- meanline: 如果為True且showmeans為True,則将畫出均值線,與中位線平行
- showmeans: 顯示算數平均值
- showcaps: 是否顯示上下邊緣線
- showbox: 是否顯示箱體,不顯示則填充顔色也不顯示
- showfliers: 是否顯示異常值
- return_type = ‘dict’,傳回類型為字典
df = pd.DataFrame(np.random.rand(10, 5), columns = list("ABCDE"))
plt.figure(figsize = (10, 4))
f = df.boxplot(notch = False, # 箱體是否帶缺口
sym = 'o', # 異常點形狀,參考marker
vert = True, # 是否垂直
whis = 1.5,
patch_artist = True, # 箱體是否進行顔色填充
meanline = True, # 如果為True且showmeans為True,則将畫出均值線,與中位線平行
showmeans = True, # 顯示算數平均值
showcaps = True, # 是否顯示上下邊緣線
showbox = True, # 是否顯示箱體,不顯示則填充顔色也不顯示
showfliers = True, # 是否顯示異常值
return_type ='dict') # 傳回類型為字典
boxes:箱體
medians:中位線
means:均值線
whiskers:豎線
caps:邊緣線
fliers:異常值
# print(f.keys())
# dict_keys(['boxes', 'fliers', 'medians', 'caps', 'whiskers', 'means'])
for box in f['boxes']:
box.set(edgecolor = 'r', facecolor = 'b', linewidth = 1, alpha = 0.5)
for median in f['medians']:
median.set(color = 'DarkBlue', linewidth = 2)
for mean in f['means']:
mean.set(color = 'y', linewidth = 2)
for whisker in f['whiskers']:
whisker.set(color = 'g', linewidth = 0.5, linestyle = '-')
for cap in f['caps']:
cap.set(color = 'gray', linewidth = 2)
for flier in f['fliers']:
flier.set(marker = 'o', alpha = 0.5) # color為箱子顔色?
3、分組繪圖
df = pd.DataFrame(np.random.rand(6, 2), columns = ['Col1', 'Col2'])
df['X'] = pd.Series(['A', 'A', 'A', 'B', 'B', 'B'])
df['Y'] = pd.Series(['A', 'B', 'B', 'B', 'A', 'A'])
'''
Col1 Col2 X Y
0 0.134612 0.451295 A A
1 0.131603 0.922581 A B
2 0.532679 0.247002 A B
3 0.863306 0.736274 B B
4 0.999598 0.052141 B A
5 0.292755 0.493295 B A
'''
df.boxplot(by = 'X')
df.boxplot(by = ['X', 'Y'], column = ['Col2'])