Python-matplotlib統(tǒng)計(jì)圖之箱線圖漫談

(1)

箱線圖,又稱箱形圖(boxplot)或盒式圖,不同于一般的折線圖、柱狀圖或餅圖等傳統(tǒng)圖表,只是數(shù)據(jù)大小、占比、趨勢(shì)等等的呈現(xiàn),其包含一些統(tǒng)計(jì)學(xué)的均值、分位數(shù)、極值等等統(tǒng)計(jì)量,因此,該圖信息量較大,不僅能夠分析不同類別數(shù)據(jù)平均水平差異(需在箱線圖中加入均值點(diǎn)),還能揭示數(shù)據(jù)間離散程度、異常值、分布差異等等。

在python中常用matplotlib的boxplot來繪制,最簡(jiǎn)單繪制的如下:

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

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

(2)
從分析的角度來說,上面boxplot最初始圖形已經(jīng)夠用,但是在matplotlib庫下boxplot函數(shù)中包含n多參數(shù),涉及到對(duì)框的顏色及形狀、線段線型、均值線、異常點(diǎn)的形狀大小等等設(shè)置,由于大多并不常用,用了幾個(gè)常用參數(shù),作圖如下:

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

Paste_Image.png

其中,sym='r*',表示異常點(diǎn)的形狀,
vert=False,表示橫向還是豎向(True),,
patch_artist=True,(上下四分位框內(nèi)是否填充,True為填充)
meanline=False,showmeans=True,是否有均值線及其形狀,meanline=True時(shí),均值線也像中位數(shù)線一樣是條紅色線段,這樣容易與中位數(shù)線混淆。
另外,還有其他參數(shù),比如notch表示中間箱體是否缺口,whis為設(shè)置數(shù)據(jù)的范圍,showcaps、showbox是否顯示邊框,可以參見
http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.boxplot,如該網(wǎng)頁中圖形:
Paste_Image.png

左上圖是默認(rèn)圖形,中上、右上是顯示均值點(diǎn)及形狀,左下是是否顯示箱體邊框,中下是帶缺口的箱體,右下是是否顯示異常值。
(3)
前邊說過,很多參數(shù)使用很少,但對(duì)于圖形來說,可能還能用到的就是美化,比如各條線的顏色,粗細(xì)程度等等。這里可用for循環(huán)來構(gòu)造。

f=df.boxplot(sym='r*',patch_artist=True)
for box in f['boxes']:
    # 箱體邊框顏色
    box.set( color='#7570b3', linewidth=2)
    # 箱體內(nèi)部填充顏色
    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分位值構(gòu)成的box,
medians, 是中位值的橫線, 每個(gè)median是一個(gè)Line2D對(duì)象
whiskers, 是指從box 到error bar之間的豎線.
fliers, 是指error bar線之外的離散點(diǎn).
caps, 是指error bar橫線.
means, 是均值的橫線,

(4)
還可以做子圖,如我們?cè)谧铋_始的DataFrame數(shù)據(jù)中加入分類數(shù)據(jù)列:

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

這樣我們就可以比較,不同類別X、Y在同一列下的數(shù)據(jù)分布情況及其差異。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容