1. 程式人生 > 實用技巧 >sns.boxplot() ,df.plot.box(),df.boxplot()箱型圖

sns.boxplot() ,df.plot.box(),df.boxplot()箱型圖

箱形圖(Box-plot):

又稱為盒須圖、盒式圖或箱線圖,是一種用作顯示一組資料分散情況資料的統計圖。它能顯示出一組資料的最大值、最小值、中位數及上下四分位數

做模型時,經常使用箱型圖檢視特徵變數有沒有異常值

一、sns.boxplot()

#引數如下:
seaborn.boxplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, orient=None, color=None, palette=None, saturation=0.75, width=0.8, dodge=True, fliersize=5, linewidth=None, whis=1.5, notch=False, ax=None, **kwargs)

引數說明:

x,y:dataframe中的列名(str)或者向量資料

data:dataframe或者陣列

hue(str):dataframe的列名,按照列名中的值分類形成分類的條形圖

palette:調色盤,控制影象的色調

order, hue_order (lists of strings):用於控制條形圖的順序

orient:"v"|"h" 用於控制影象使水平還是豎直顯示(這通常是從輸入變數的dtype推斷出來的,此引數一般當不傳入x、y,只傳入data的時候使用)

fliersize:float,用於指示離群值觀察的標記大小

whis: 確定離群值的上下界(IQR超過低和高四分位數的比例),此範圍之外的點將被識別為異常值。IQR指的是上下四分位的差值。

width: float,控制箱型圖的寬度

使用iris資料集作為例子

x引數(箱型圖橫著放,預設也是橫著放)

%matplotlib inline
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
plt.rc("font",family="SimHei",size="15")  #解決中文亂碼問題

data=pd.DataFrame(load_iris().data,columns=load_iris().feature_names)
data[
'sample']=load_iris().target data.columns #x引數,下面結果都一致 sns.boxplot(x=data['sepal length (cm)']) sns.boxplot(x=data['sepal length (cm)'],data=data) sns.boxplot(x='sepal length (cm)',data=data) sns.boxplot(data['sepal length (cm)'])

y引數(豎著放)

#y引數,下面結果都一致
sns.boxplot(y=data['sepal length (cm)'])
sns.boxplot(y=data['sepal length (cm)'],data=data)
sns.boxplot(y='sepal length (cm)',data=data)
sns.boxplot(y='sample',data=data)

#直接是data
sns.boxplot(data=data)

#x,y同時使用,x的類別最要不要太多,最好是類別型(或者類別少的)為x,數值型(或者類別多的)為y
sns.boxplot(x='sepal length (cm)',y='petal length (cm)',data=data)
sns.boxplot(x='sepal length (cm)',y='sample',data=data)
sns.boxplot(y='sepal length (cm)',x='sample',data=data)

#x,y,hue
sns.boxplot(x='sepal length (cm)',y='petal length (cm)',hue='sample',data=data)

#用於控制影象使水平還是豎直顯示
fig,axes=plt.subplots(2,1)
sns.boxplot(data=data,orient="v",palette="Set3",ax=axes[0])  #豎直顯示
sns.boxplot(data=data,orient="h",palette="Set3",ax=axes[1])  #水平顯示 

#fliersize:float,用於指示離群值觀察的標記大小
fig,axes=plt.subplots(1,2)
sns.boxplot(data=data,ax=axes[0]) #fliersize預設為5
sns.boxplot(data=data,fliersize=20,ax=axes[1])  

#whis: 確定離群值的上下界(IQR超過低和高四分位數的比例),此範圍之外的點將被識別為異常值。IQR指的是上下四分位的差值
fig,axes=plt.subplots(1,2)
sns.boxplot(data=data,whis=1,ax=axes[0])  #左圖
sns.boxplot(data=data,whis=2,ax=axes[1])  #右圖

#width: float,控制箱型圖的寬度
fig,axes=plt.subplots(1,2)
sns.boxplot(data=data,width=0.3,ax=axes[0])  #左圖
sns.boxplot(data=data,width=0.8,ax=axes[1])  #右圖

二、df.plot.box()反正就是df畫圖

#df.boxplot
data.boxplot()
data.plot.box()
data['sample'].boxplot()  #這樣不行
data['sepal length (cm)'].plot.box()
data.boxplot('sepal length (cm)')
data.boxplot(['sepal length (cm)'])
data.boxplot(['sepal length (cm)','petal length (cm)'])

三、plt.boxplot(),看來x只有接收一個特徵時才比較適用

plt.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=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)

x:指定要繪製箱線圖的資料
notch:是否以凹口的形式展現箱線圖,預設非凹口
sym:指定異常點的形狀,預設為+號顯示
vert:是否需要將箱線圖垂直襬放,預設垂直襬放
whis:指定上下須與上下四分位的距離,預設為1.5倍的四分位差
positions:指定箱線圖的位置,預設為[0,1,2…]
widths:指定箱線圖的寬度,預設為0.5
patch_artist:bool型別引數,是否填充箱體的顏色;預設為False
meanline:bool型別引數,是否用線的形式表示均值,預設為False
showmeans:bool型別引數,是否顯示均值,預設為False
showcaps:bool型別引數,是否顯示箱線圖頂端和末端的兩條線(即上下須),預設為True
showbox:bool型別引數,是否顯示箱線圖的箱體,預設為True
showfliers:是否顯示異常值,預設為True
boxprops:設定箱體的屬性,如邊框色,填充色等
labels:為箱線圖新增標籤,類似於圖例的作用
filerprops:設定異常值的屬性,如異常點的形狀、大小、填充色等
medianprops:設定中位數的屬性,如線的型別、粗細等
meanprops:設定均值的屬性,如點的大小、顏色等
capprops:設定箱線圖頂端和末端線條的屬性,如顏色、粗細等
whiskerprops:設定須的屬性,如顏色、粗細、線的型別等
#plt.boxplot(),
plt.boxplot(x=data)  #什麼鬼,看不清楚
plt.boxplot(x=data[['sample','petal length (cm)']])  #還是看不清楚
plt.boxplot(x=data['sepal length (cm)'])

全部程式碼如下:

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 21 10:52:00 2020

@author: Admin
"""

%matplotlib inline
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
plt.rc("font",family="SimHei",size="15")  #解決中文亂碼問題

data=pd.DataFrame(load_iris().data,columns=load_iris().feature_names)
data['sample']=load_iris().target
data.columns
data.info()

#x引數,下面結果都一致
sns.boxplot(x=data['sepal length (cm)'])
sns.boxplot(x=data['sepal length (cm)'],data=data)
sns.boxplot(x='sepal length (cm)',data=data)
sns.boxplot(data['sepal length (cm)'])


#y引數,下面結果都一致
sns.boxplot(y=data['sepal length (cm)'])
sns.boxplot(y=data['sepal length (cm)'],data=data)
sns.boxplot(y='sepal length (cm)',data=data)
sns.boxplot(y='sample',data=data)


#直接是data
sns.boxplot(data=data)

#x,y同時使用,x的類別最要不要太多,最好是類別型(或者類別少的)為x,數值型(或者類別多的)為y
sns.boxplot(x='sepal length (cm)',y='petal length (cm)',data=data)
sns.boxplot(x='sepal length (cm)',y='sample',data=data)
sns.boxplot(y='sepal length (cm)',x='sample',data=data)
sns.boxplot(x='sample',y='sepal length (cm)',data=data)

#x,y,hue
sns.boxplot(x='sepal length (cm)',y='petal length (cm)',hue='sample',data=data)


#用於控制影象使水平還是豎直顯示
fig,axes=plt.subplots(2,1)
sns.boxplot(data=data,orient="v",palette="Set3",ax=axes[0])  #豎直顯示
sns.boxplot(data=data,orient="h",palette="Set3",ax=axes[1])  #水平顯示 

#fliersize:float,用於指示離群值觀察的標記大小
fig,axes=plt.subplots(1,2)
sns.boxplot(data=data,ax=axes[0]) #fliersize預設為5
sns.boxplot(data=data,fliersize=20,ax=axes[1])  


#whis: 確定離群值的上下界(IQR超過低和高四分位數的比例),此範圍之外的點將被識別為異常值。IQR指的是上下四分位的差值
fig,axes=plt.subplots(1,2)
sns.boxplot(data=data,whis=1,ax=axes[0])  #左圖
sns.boxplot(data=data,whis=2,ax=axes[1])  #右圖

#width: float,控制箱型圖的寬度
fig,axes=plt.subplots(1,2)
sns.boxplot(data=data,width=0.3,ax=axes[0])  #左圖
sns.boxplot(data=data,width=0.8,ax=axes[1])  #右圖

#df.boxplot
data.boxplot()
data.plot.box()
data['sample'].boxplot()  #這樣不行
data['sepal length (cm)'].plot.box()
data.boxplot('sepal length (cm)')
data.boxplot(['sepal length (cm)'])
data.boxplot(['sepal length (cm)','petal length (cm)'])


#plt.boxplot(),
plt.boxplot(x=data)  #什麼鬼,看不清楚
plt.boxplot(x=data[['sample','petal length (cm)']])  #還是看不清楚
plt.boxplot(x=data['sepal length (cm)'])