天天看點

[三] 3 圖表繪制工具:Matplotlib -- 圖表繪制之箱形圖九、箱形圖

目錄

  • 九、箱形圖
    • 1、plt.plot.box()
    • 2、plt.boxplot()
    • 3、分組繪圖

九、箱形圖

箱形圖又稱為盒須圖、盒式圖或箱線圖,它主要用于反映原始資料分布的特征,還可以進行多組資料分布特征的比較。

[三] 3 圖表繪制工具:Matplotlib -- 圖表繪制之箱形圖九、箱形圖
  • 中位數:按順序排列的一組資料中居于中間位置的數
  • 上四分位數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])
           
[三] 3 圖表繪制工具:Matplotlib -- 圖表繪制之箱形圖九、箱形圖
[三] 3 圖表繪制工具:Matplotlib -- 圖表繪制之箱形圖九、箱形圖

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') # 傳回類型為字典
           
[三] 3 圖表繪制工具:Matplotlib -- 圖表繪制之箱形圖九、箱形圖

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 圖表繪制工具:Matplotlib -- 圖表繪制之箱形圖九、箱形圖

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'])
           
[三] 3 圖表繪制工具:Matplotlib -- 圖表繪制之箱形圖九、箱形圖
[三] 3 圖表繪制工具:Matplotlib -- 圖表繪制之箱形圖九、箱形圖

繼續閱讀