1. 程式人生 > >Python-matplotlib統計圖之箱線圖漫談

Python-matplotlib統計圖之箱線圖漫談

https://www.jianshu.com/p/b2f70f867a4a

箱線圖,又稱箱形圖(boxplot)或盒式圖,不同於一般的折線圖、柱狀圖或餅圖等傳統圖表,只是資料大小、佔比、趨勢等等的呈現,其包含一些統計學的均值、分位數、極值等等統計量,因此,該圖資訊量較大,不僅能夠分析不同類別資料平均水平差異(需在箱線圖中加入均值點),還能揭示資料間離散程度、異常值、分佈差異等等。

在python中常用matplotlib的boxplot來繪製,最簡單繪製的如下:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
np.random.seed(2)  #設定隨機種子
df = pd.DataFrame(np.random.rand(5,4),
columns=['A', 'B', 'C', 'D'])#先生成0-1之間的5*4維度資料,再裝入4列DataFrame中
df.boxplot() #也可用plot.box()
plt.show()

Paste_Image.png

從圖形可以看出,A、B、C、D四組數A、D資料較集中(大部分在上下四分位箱體內),但都有異常值,C的離散程度最大(最大值與最小值之間距離),以均值為中心,B分佈都有明顯右偏(即較多的值分佈在均值的右側),A、C則有明顯左偏。

(2)
從分析的角度來說,上面boxplot最初始圖形已經夠用,但是在matplotlib庫下boxplot函式中包含n多引數,涉及到對框的顏色及形狀、線段線型、均值線、異常點的形狀大小等等設定,由於大多並不常用,用了幾個常用引數,作圖如下:

df.boxplot(sym='r*',vert=False,patch_artist=True,meanline=False,showmeans=True)
plt.show()

 

Paste_Image.png


其中,sym='r*',表示異常點的形狀,
vert=False,表示橫向還是豎向(True),,
patch_artist=True,(上下四分位框內是否填充,True為填充)
meanline=False,showmeans=True,是否有均值線及其形狀,meanline=True時,均值線也像中位數線一樣是條紅色線段,這樣容易與中位數線混淆。
另外,還有其他引數,比如notch表示中間箱體是否缺口,whis為設定資料的範圍,showcaps、showbox是否顯示邊框,可以參見
http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.boxplot

,如該網頁中圖形:

Paste_Image.png


左上圖是預設圖形,中上、右上是顯示均值點及形狀,左下是是否顯示箱體邊框,中下是帶缺口的箱體,右下是是否顯示異常值。
(3)
前邊說過,很多引數使用很少,但對於圖形來說,可能還能用到的就是美化,比如各條線的顏色,粗細程度等等。這裡可用for迴圈來構造。

 

f=df.boxplot(sym='r*',patch_artist=True)
for box in f['boxes']:
    # 箱體邊框顏色
    box.set( color='#7570b3', linewidth=2)
    # 箱體內部填充顏色
    box.set( facecolor = '#1b9e77' )
for whisker in f['whiskers']:
    whisker.set(color='r', linewidth=2)
for cap in f['caps']:
    cap.set(color='g', linewidth=3)
for median in f['medians']:
    median.set(color='DarkBlue', linewidth=3)
for flier in f['fliers']:
    flier.set(marker='o', color='y', alpha=0.5)
plt.show()

Paste_Image.png

其中,boxes, 是25分位值和75分位值構成的box,
medians, 是中位值的橫線, 每個median是一個Line2D物件
whiskers, 是指從box 到error bar之間的豎線.
fliers, 是指error bar線之外的離散點.
caps, 是指error bar橫線.
means, 是均值的橫線,

(4)
還可以做子圖,如我們在最開始的DataFrame資料中加入分類資料列:

df['E'] = np.random.choice(['X', 'Y'], size=20)#加入以X、Y隨機分類的E列
print(df)
plt.figure()
df.boxplot(by='E')
plt.show()

Paste_Image.png

 

 


作者:博觀厚積
連結:https://www.jianshu.com/p/b2f70f867a4a
來源:簡書