seaborn學習筆記(四):箱型圖、小提琴圖

奧辰發表於2022-02-23
In [1]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
In [3]:
tips = sns.load_dataset("tips")
In [4]:
tips.head(2)
Out[4]:
 
 total_billtipsexsmokerdaytimesize
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
 

1 箱型圖

箱形圖(Box-plot)又稱為盒須圖、盒式圖或箱線圖,是一種用作顯示一組資料分散情況資料的統計圖。在seaborn中,boxplot()方法用於繪製箱型圖。boxplot()主要引數如下:

 
  • x,y:指定的x軸, y軸資料,可以是向量或者字串,當是字串時,一定是data中的一個key
  • hue:可以是向量(pandas中的一列,或者是list),也可以是字串(data中的一個key),seaborn將根據這一列設定不同顏色
  • data:繪圖資料,可以是pandas.DataFrame,numpy.ndarray或者字典等
  • order:包含所有分組屬性的列表,用於指定條形順序,注意如果某個分組不在order中,該分組將不會顯示
  • hue_order:字串組成的list,設定hue後設定各顏色順序
  • orient:當x,y都是離散型或者數值型資料時,通過orient可設定影像方向
  • color:統一設定所有箱體的顏色
  • palette:顏色皮膚
  • saturation:顏色飽和度
  • width:設定箱體寬度
  • dodge:是否重疊繪製(設定hue之後生效)
  • fliersize:箱體上方離群點的大小
  • linewidth:箱體邊框線的粗細
  • whis:確定離群值的上下界(IQR超過低和高四分位數的比例),此範圍之外的點將被識別為異常值。IQR指的是上下四分位的差值。
 

1.1 x, y:傳遞資料,控制圖形方向

 

x, y為繪圖時指定的x軸和y軸資料,x、y如果有一個是離散型資料(或者說定性資料、分類資料),另一個是連續性數值資料,seaborn將會根據其中的離散型資料對另一個連續性資料進行繪製其在另一條數軸上的分佈。

In [5]:
fig, ax =plt.subplots(1,2,constrained_layout=True, figsize=(8, 3))
pic = sns.boxplot(x="day", y="total_bill", data=tips, ax=ax[0])
pic.set_title('x="day", y="total_bill"')
pic = sns.boxplot(x="total_bill", y="day", data=tips, ax=ax[1])
pic.set_title('x="total_bill", y="day"')
Out[5]:
Text(0.5, 1.0, 'x="total_bill", y="day"')
 
seaborn學習筆記(四):箱型圖、小提琴圖
 

1.2 hue與dodge:根據指定指定繪製箱體顏色

hue和dodge常常需要一起配合使用,hue只是根據指定欄位繪製不同顏色的散點,進一步地,dodge為Flase可以將不同顏色的箱體重疊。

In [18]:
fig, ax =plt.subplots(1,2,constrained_layout=True, figsize=(8, 3))
pic = sns.boxplot(x="day", y="total_bill", data=tips, ax=ax[0], hue="smoker")
pic.set_title('hue="smoker"')
pic = sns.boxplot(x="day", y="total_bill", data=tips, ax=ax[1], hue="smoker", dodge=False)
pic.set_title('hue="smoker", dodge=False')
Out[18]:
Text(0.5, 1.0, 'hue="smoker", dodge=False')
 
seaborn學習筆記(四):箱型圖、小提琴圖
 

1.3 order:指定條形順序

In [8]:
fig, ax =plt.subplots(1,2,constrained_layout=True, figsize=(8, 3))
pic = sns.boxplot(x="day", y="total_bill", data=tips, ax=ax[0])
pic.set_title('default order')
pic = sns.boxplot(x="day", y="total_bill", data=tips, order=['Sun', 'Sat', 'Thur', 'Fri'], ax=ax[1])
pic.set_title('"Sun", "Sat", "Thur", "Fri"')
Out[8]:
Text(0.5, 1.0, '"Sun", "Sat", "Thur", "Fri"')
 
seaborn學習筆記(四):箱型圖、小提琴圖
 

1.4 color,saturation:設定條形顏色和飽和度

注意,color只能一次性設定所有條形統一的顏色,如果要為條形設定不同顏色,要通過palette引數:

In [11]:
ax = sns.boxplot(x="day", y="total_bill", data=tips, color="red")
 
seaborn學習筆記(四):箱型圖、小提琴圖
In [12]:
ax = sns.boxplot(x="day", y="total_bill", data=tips, color="red",saturation=0.5 )
 
seaborn學習筆記(四):箱型圖、小提琴圖
 

1.5 width:設定箱體寬度

In [15]:
fig, ax =plt.subplots(1,2,constrained_layout=True, figsize=(8, 3))
pic = sns.boxplot(x="day", y="total_bill", data=tips, ax=ax[0])
pic.set_title('default width')
pic = sns.boxplot(x="day", y="total_bill", data=tips, ax=ax[1], width=0.5)
pic.set_title('width=0.5')
Out[15]:
Text(0.5, 1.0, 'width=0.5')
 
seaborn學習筆記(四):箱型圖、小提琴圖
 

1.6 fliersize:箱體上方離群點的大小

In [23]:
fig, ax =plt.subplots(1,2,constrained_layout=True, figsize=(8, 3))
pic = sns.boxplot(x="day", y="total_bill", data=tips, ax=ax[0])
pic.set_title('default fliersize: 5')
pic = sns.boxplot(x="day", y="total_bill", data=tips, ax=ax[1], fliersize=1)
pic.set_title('fliersize=1')
Out[23]:
Text(0.5, 1.0, 'fliersize=1')
 
seaborn學習筆記(四):箱型圖、小提琴圖
 

1.7 linewidth:箱體邊框線的粗細

In [28]:
fig, ax =plt.subplots(1,3,constrained_layout=True, figsize=(8, 3))
pic = sns.boxplot(x="day", y="total_bill", data=tips, ax=ax[0])
pic.set_title('default linewidth')
pic = sns.boxplot(x="day", y="total_bill", data=tips, ax=ax[1], linewidth=1)
pic.set_title('linewidth=1')
pic = sns.boxplot(x="day", y="total_bill", data=tips, ax=ax[2], linewidth=5)
pic.set_title('linewidth=5')
Out[28]:
Text(0.5, 1.0, 'linewidth=5')
 
seaborn學習筆記(四):箱型圖、小提琴圖
 

1.8 whis:確定離群值的上下界

In [30]:
fig, ax =plt.subplots(1,3,constrained_layout=True, figsize=(8, 3))
pic = sns.boxplot(x="day", y="total_bill", data=tips, ax=ax[0])
pic.set_title('default whis: 1.5')
pic = sns.boxplot(x="day", y="total_bill", data=tips, ax=ax[1], whis=2)
pic.set_title('whis=2')
pic = sns.boxplot(x="day", y="total_bill", data=tips, ax=ax[2], whis=3)
pic.set_title('whis=3')
Out[30]:
Text(0.5, 1.0, 'whis=3')
 
seaborn學習筆記(四):箱型圖、小提琴圖
 

2 增強箱型圖:boxenplot()

boxenplot()是為更大的資料集繪製增強的箱型圖。這種風格的繪圖最初被命名為“信值圖”,因為它顯示了大量被定義為“置信區間”的分位數。它類似於繪製分佈的非參數列示的箱形圖,其中所有特徵對應於實際觀察的數值點。通過繪製更多分位數,它提供了有關分佈形狀的更多資訊,特別是尾部資料的分佈。

作為增強版的boxplot(),boxenplot()大部分引數和boxplot()是相似的。現在就剩下不同的引數進行說明:

  • k_depth:“proportion” 或 “tukey” 或 “trustworthy”,也可以是標量整數,通過增大百分比的粒度控制繪製的盒形圖數目。每個引數代表利用不同的統計特性對異常值的數量做出不同的假設。

  • scale:“linear” 或 “exponential” 或 “area”,用於控制增強箱型圖寬度的方法。所有引數都會給顯示效果造成影響。 “linear” 通過恆定的線性因子減小寬度,“exponential” 使用未覆蓋的資料的比例調整寬度, “area” 與所覆蓋的資料的百分比成比例。

  • outlier_prop:float,被認為是異常值的資料比例。與 k_depth 結合使用以確定要繪製的百分位數。預設值為 0.007 作為異常值的比例。該引數取值應在[0,1]範圍內。

 

boxenplot()用的不多,大部分引數與boxplot()一樣,不再演示,增強箱型圖外觀如下圖所示:

In [53]:
_ = sns.boxenplot(x="day", y="total_bill", data=tips)
 
seaborn學習筆記(四):箱型圖、小提琴圖
 

3 小提琴圖:violinplot()

violinplot()是用來繪製箱形圖和核密度估計組合圖,即小提琴圖。小提琴形圖的作用與箱形圖類似,它顯示了一個或多個分類變數的幾個級別的定量資料的分佈,我們可以通過觀察來比較這些分佈。與盒形圖不同,因為盒形圖的所有繪圖元件都對應於實際資料點,小提琴形圖具有底層分佈的核密度估計。

  • x,y:指定的x軸, y軸資料,可以是向量或者字串,當是字串時,一定是data中的一個key
  • hue:可以是向量(pandas中的一列,或者是list),也可以是字串(data中的一個key),seaborn將根據這一列設定不同顏色
  • data:繪圖資料,可以是pandas.DataFrame,numpy.ndarray或者字典等
  • order:包含所有分組屬性的列表,用於指定條形順序,注意如果某個分組不在order中,該分組將不會顯示
  • hue_order:字串組成的list,設定hue後設定各顏色順序
  • bw:'scott','silverman'或float數值,計算核心頻寬時使用的引用規則的名稱或比例因子。實際核心大小將通過將比例因子乘以每個bin中資料的標準差來確定。
  • cut:以頻寬大小為單位的距離,用於將密度擴充套件到超過極端資料點。設定為0可將小提琴範圍限制在觀測資料範圍內(即,與ggplot中的trim=true具有相同的效果)
  • scale:“area”, “count”, “width”,用於縮放每個小提琴寬度。如果是“area”,每個小提琴都會有相同的區域。如果“count”,小提琴的寬度將按照該箱中的觀察次數進行縮放。如果“width”,每個小提琴將具有相同的寬度
  • gridsize:用於計算核密度估計的離散網格中的點數
  • width:設定箱體寬度
  • inner:'box','quartile','point','stick',None,表示小提琴內部的資料點。如果是框,畫一個微型箱圖。如果是四分位數,則繪製分佈的四分位數。如果point或stick,則顯示每個基礎資料點。使用None將繪製未經修飾的小提琴
  • split:當使用帶有兩個級別的變數的色調巢狀(hue)時,將split設定為True將為每個級別繪製一半小提琴。這樣可以更容易比較分佈。
  • dodge:是否重疊繪製(設定hue之後生效)
  • orient:當x,y都是離散型或者數值型資料時,通過orient可設定影像方向
  • linewidth:箱體邊框線的粗細
  • color:統一設定所有箱體的顏色
  • palette:顏色皮膚
  • saturation:顏色飽和度
  • ax:自定義座標系
 

3.1 x, y:傳遞資料,控制圖形方向

 

x, y為繪圖時指定的x軸和y軸資料,x、y如果有一個是離散型資料(或者說定性資料、分類資料),另一個是連續性數值資料,seaborn將會根據其中的離散型資料對另一個連續性資料進行繪製其在另一條數軸上的分佈。

In [59]:
fig, ax =plt.subplots(1,2,constrained_layout=True, figsize=(8, 3))
pic = sns.violinplot(x="day", y="total_bill", data=tips, ax=ax[0])
pic.set_title('x="day", y="total_bill"')
pic = sns.violinplot(x="total_bill", y="day", data=tips, ax=ax[1])
_ = pic.set_title('x="total_bill", y="day"')
 
seaborn學習筆記(四):箱型圖、小提琴圖
 

3.2 hue與dodge:根據指定指定繪製箱體顏色

hue和dodge常常需要一起配合使用,hue只是根據指定欄位繪製不同顏色的散點,進一步地,dodge為Flase可以將不同顏色的箱體重疊。

In [60]:
fig, ax =plt.subplots(1,2,constrained_layout=True, figsize=(8, 3))
pic = sns.violinplot(x="day", y="total_bill", data=tips, ax=ax[0], hue="smoker")
pic.set_title('hue="smoker"')
pic = sns.violinplot(x="day", y="total_bill", data=tips, ax=ax[1], hue="smoker", dodge=False)
_ = pic.set_title('hue="smoker", dodge=False')
 
seaborn學習筆記(四):箱型圖、小提琴圖
 

3.3 order:指定條形順序

In [61]:
fig, ax =plt.subplots(1,2,constrained_layout=True, figsize=(8, 3))
pic = sns.violinplot(x="day", y="total_bill", data=tips, ax=ax[0])
pic.set_title('default order')
pic = sns.violinplot(x="day", y="total_bill", data=tips, order=['Sun', 'Sat', 'Thur', 'Fri'], ax=ax[1])
_ = pic.set_title('"Sun", "Sat", "Thur", "Fri"')
 
seaborn學習筆記(四):箱型圖、小提琴圖
 

3.4 color與saturation:設定條形顏色和飽和度

注意,color只能一次性設定所有條形統一的顏色,如果要為條形設定不同顏色,要通過palette引數:

In [63]:
ax = sns.violinplot(x="day", y="total_bill", data=tips, color="red")
 
seaborn學習筆記(四):箱型圖、小提琴圖
In [64]:
ax = sns.violinplot(x="day", y="total_bill", data=tips, color="red",saturation=0.5 )
 
seaborn學習筆記(四):箱型圖、小提琴圖
 

3.5 split:使用hue後是否單獨繪圖

In [73]:
fig, ax =plt.subplots(1,2,constrained_layout=True, figsize=(12, 3))
pic = sns.violinplot(x="day", y="total_bill", data=tips, ax=ax[0], hue="smoker")
pic.set_title('no split')
pic = sns.violinplot(x="day", y="total_bill", data=tips, ax=ax[1], hue="smoker", split=True)
pic.set_title('split=True')
Out[73]:
Text(0.5, 1.0, 'split=True')
 
seaborn學習筆記(四):箱型圖、小提琴圖
In [70]:
ax = sns.violinplot(x="day", y="total_bill", hue="smoker",
                    data=tips, palette="muted", split=True)
 
seaborn學習筆記(四):箱型圖、小提琴圖
 

3.6 linewidth:箱體邊框線的粗細

In [74]:
fig, ax =plt.subplots(1,3,constrained_layout=True, figsize=(8, 3))
pic = sns.violinplot(x="day", y="total_bill", data=tips, ax=ax[0])
pic.set_title('default linewidth')
pic = sns.violinplot(x="day", y="total_bill", data=tips, ax=ax[1], linewidth=1)
pic.set_title('linewidth=1')
pic = sns.violinplot(x="day", y="total_bill", data=tips, ax=ax[2], linewidth=5)
pic.set_title('linewidth=5')
Out[74]:
Text(0.5, 1.0, 'linewidth=5')
 
seaborn學習筆記(四):箱型圖、小提琴圖
 

3.7 width:設定箱體寬度

In [81]:
fig, ax =plt.subplots(1,2,constrained_layout=True, figsize=(12, 3))
pic = sns.violinplot(x="day", y="total_bill", data=tips, ax=ax[0])
pic.set_title('default width')
pic = sns.violinplot(x="day", y="total_bill", data=tips, ax=ax[1], width=1)
_ = pic.set_title('width=1')
 
seaborn學習筆記(四):箱型圖、小提琴圖

相關文章