箱型圖(Box Plots)/小提琴圖(Violin Plots)是一個能夠很好地表現資料的分佈情況的統計圖。我們將在本文章中介紹如何用 Python 的 Matplotlib、Seaborn、和 Plotly Express 套件來繪製箱型圖與小提琴圖。
Table of Contents
概念
在開始用 Python 來繪製圖表之前,先讓我們了解一下箱型圖和小提琴圖的構造。
箱型圖(Box Plots)
下圖顯示箱型圖的構造。
- 下四分位數(Q1, 1st quartile, or 25th percentile):前 50% 資料(lower half)的平均值。
- 中位數(Q2, Median, or 50th percentile):全部資料的平均值。
- 上四分位數(Q3, 3rd quartile, or 75th percentile):後 50% 資料(upper half)的平均值。
- 四分位間距(IRQ, or Interquartile range):Q3 – Q1。
- 最小值(Q0, or minimum):Q1 – 1.5 * IRQ。
- 最大值(Q4, or maximum):Q3 + 1.5 * IRQ。
- 鬚(Whiskers):Q0 到 Q1 與 Q3 到 Q4 間的直線。
- 離群值(Outliers):不在 Q0 到 Q4 間的值。
小提琴圖(Violin Plots)
小提琴圖和箱型圖一樣可以顯示資料的分佈情況。此外,它還顯示出概率密度。下圖為它們的對照圖。
範例的資料集
本文章的範例都使用 seaborn 的 tips 資料集。下面的範例展示如何讀取資料集,並顯示資料集的欄位。
import seaborn as sns tips = sns.load_dataset('tips') tips.head()
total_bill | tip | sex | somker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
Matplotlib
Box Plots
Matplotlib 的 boxplot() 可用來繪製箱型圖。以下是它的宣告。其餘的參數請參照官網。
matplotlib.pyplot.boxplot(x, sym=None, vert=None, labels=None)
- x:資料。
- sym:離群值的圖案。
- vert:垂直或水平的箱型圖。
- labels:每個資料集的標籤。
下面的範例顯示如何使用 boxplot() 來繪製箱型圖。
import matplotlib.pyplot as plt plt.boxplot(tips[['total_bill', 'tip']], labels=['total_bill', 'tip']) plt.title('Box Plot') plt.xlabel('Total Bill vs Tip') plt.ylabel('Money') plt.show()
在這範例中,我們可以看到 boxplot() 的使用方式相當地簡單。之後,呼叫 title() 來設定圖表的標題,再呼叫 xlabel() 和 ylabel() 來設定 x 軸與 y 軸的標題。
如果你想要繪製水平的箱型圖的話,只需要設定參數 vert 為 False
即可,如下範例。
plt.boxplot(tips[['total_bill', 'tip']], vert=False, labels=['total_bill', 'tip']) plt.title('Box Plot') plt.xlabel('Money') plt.ylabel('Total Bill vs Tip') plt.show()
Violin Plots
與繪製箱型圖差不多地簡單,Matplotlib 也有提供專門的函式來繪製小提琴圖,那就是 violinplot()。它的宣告如下。其餘的參數請參照官網。
matplotlib.pyplot.violinplot(dataset, vert=True)
- x:資料。
- vert:垂直或水平的箱型圖。
相較於 boxplot(),violinplot() 的參數相對少了很多。讓我們先來看一下使用範例。
import matplotlib.pyplot as plt plt.violinplot(tips[['total_bill', 'tip']]) plt.xticks([1, 2], ['total_bill', 'tip']) plt.title('Violin Plot') plt.xlabel('Total Bill vs Tip') plt.ylabel('Money') plt.show()
從範例中我們可以看出其實繪製小提琴圖也是很簡單地,只是 violinplot() 並沒有提供設定資料集的標籤參數。不過,我們可以用 xticks() 來設定標籤。
下面的範例顯示如何繪製水平的小提琴圖。
plt.violinplot(tips[['total_bill', 'tip']], vert=False) plt.yticks([1, 2], ['total_bill', 'tip']) plt.title('Violin Plot') plt.xlabel('Money') plt.ylabel('Total Bill vs Tip') plt.show()
Seaborn
Box Plots
與 Matplotlib 一樣,Seaborn 的函式也叫 boxplot() 。讓我們來看一下它的宣告。其餘的參數請參照官網。
seaborn.boxplot(x=None, y=None, hue=None, data=None, palette=None)
- x:x 軸的 long-form 資料。
- y:y 軸的 long-form 資料。
- hue:分群不同的顏色。
- palette:Color map。
- data:資料。
讓我們馬上來看一下它的使用範例吧。
sns.boxplot(data=tips[['total_bill', 'tip']], palette='Set2')
Seaborn 果然是相當地好用。它自動使用欄位的名稱來當作資料集的標籤。範例中,我們來設定參數 palette 來使用不同的 color map。
接下來的範例顯示搭配參數 x 和 y 的使用方法。
sns.boxplot(data=tips, x='day', y='total_bill', palette='Set2')
在這範例中,我們設定參數 x 為 day
欄位。boxplot() 就會使用 day
欄位的資料,並且將資料分群,所以變成有四個資料。這可以用在當你想要顯示某的資料中,各個值的分佈情況。
下面的範例顯示如何繪製水平的箱型圖。
sns.boxplot(data=tips, x='total_bill', y='day', palette='Set2')
Seaborn 會自動判斷資料的型態來選擇要繪製水平或是垂直的箱型圖。當然,你也可以使用參數 orient 來直接指定水平或是垂直。
最後一個範例則是顯示參數 hue 的使用方法。
sns.boxplot(data=tips, x='day', y='total_bill', hue='smoker')
參數 hue 可以顯示兩組資料的箱型圖。這可以用來比對兩組資料的分佈情況。此外,它還會顯示左上角的說明圖示。
Violin Plots
Seaborn 也提供專門的函式來繪製小提琴圖,那就是 violinplot()。其餘的參數請參照官網。
seaborn.violinplot(x=None, y=None, hue=None, data=None, palette=None, split=False)
- x:x 軸的 long-form 資料。
- y:y 軸的 long-form 資料。
- hue:分群不同的顏色。
- palette:Color map。
- data:資料。
- split:分群時,繪製各個資料集在一半的小提琴圖上。
Seaborn 的 violinplot() 的參數與 boxplot() 非常的相近。讓我們來看看以下的範例。
sns.violinplot(data=tips[['total_bill', 'tip']], palette='Set2')
接下來的是搭配參數 x 和 y 的範例。
sns.violinplot(data=tips, x='day', y='total_bill', palette='Set2')
下面顯示水平的小提琴圖。
sns.violinplot(data=tips, x='total_bill', y='day', palette='Set3')
下面的範例是顯示參數 hue 的使用方法。
sns.violinplot(data=tips, x='day', y='total_bill', hue='smoker')
最後來看一下參數 split 的使用範例。
sns.violinplot(data=tips, x='day', y='total_bill', hue='smoker', split=True)
筆者個人覺得 Seaborn 對於函式的設計相當地不錯。由於箱型圖和小提琴圖有很多相同的元素,兩個函式的參數與使用方式理應也是要相同。
Plotly Express
Box Plots
Plotly Express 的 box() 可用來繪製箱型圖。它的宣告如下。其餘的參數請參照官網。
plotly.express.box(data_frame=None, x=None, y=None, color=None, points=None, title=None)
- data_frame:資料。
- x:x 軸的 long-form 資料。
- y:y 軸的 long-form 資料。
- color:分群不同的顏色。
- points:顯示資料,其值可為下:
- ‘outliers’:顯示離群值。此為預設值。
- ‘all’:顯示全部的值。
- ‘suspectedoutliers’:顯示小於 4*Q1-3*Q3 或大於 4*Q3-3Q1 的值。
- False:不顯示任何值。
- title:圖表標題。
讓我們馬上來看一個 box() 的範例。
import plotly.express as px px.box(tips[['total_bill', 'tip']], title='Plotly Express Box Plot')
box() 的用法與相當地簡單而且直覺。
下一個範例是搭配參數 x 與 y 的使用方法。
px.box(tips, x='day', y='total_bill', title='Plotly Express Box Plot')
與 Seaborn 的一樣,當指定參數 x 為 day
時,它會將 day
欄位的資料做分群成為四組資料集。
box() 會根據資料的值的型態來決定要繪製水平或是垂直的箱型圖,其範例如下。
px.box(tips, x='total_bill', y='day', title='Plotly Express Box Plot')
接下來的範例顯示如何使用參數 color。
px.box(tips, x='day', y='total_bill', color='smoker', title='Plotly Express Box Plot')
參數 color 可以顯示兩組資料集,並且在右方顯示說明圖示。
最後的範例是顯示如何使用參數 points 來顯示資料的概率密度。
px.box(tips[['total_bill', 'tip']], title='Plotly Express Box Plot', points='all')
官網還有更多的箱型圖範例可供參考。
Violin Plots
Plotly Express 提供 violin() 來繪製小提琴圖。它的宣告如下。其餘的參數請參照官網。
plotly.express.violin(data_frame=None, x=None, y=None, color=None, points=None, title=None)
- data_frame:資料。
- x:x 軸的 long-form 資料。
- y:y 軸的 long-form 資料。
- color:分群不同的顏色。
- points:顯示資料,其值可為下:
- ‘outliers’:顯示離群值。此為預設值。
- ‘all’:顯示全部的值。
- ‘suspectedoutliers’:顯示小於 4*Q1-3*Q3 或大於 4*Q3-3Q1 的值。
- False:不顯示任何值。
- title:圖表標題。
violin() 的參數與 box() 的參數大同小異,所以它們的使用方式當然也是很相似。讓我們來看以下的範例。
import plotly.express as px px.violin(tips[['total_bill', 'tip']], title='Plotly Express Box Plot')
下一個範例是搭配參數 x 與 y。
px.violin(tips, x='day', y='total_bill', title='Plotly Express Box Plot')
下面是水平小提琴圖的範例。
px.violin(tips, x='total_bill', y='day', title='Plotly Express Box Plot')
以下是參數 color 的使用範例。
px.violin(tips, x='day', y='total_bill', color='smoker', title='Plotly Express Box Plot')
最後一個範例是顯示如何使用參數 points。
px.violin(tips[['total_bill', 'tip']], title='Plotly Express Box Plot', points='all')
可以看出點的分佈與概率密度,其實小提琴圖本身就顯示出來了。所以,我們不太需要在小提琴圖上額外地再顯示點。
官網還有很多小提琴圖的範例可供參考。
結論
我們在本文章中介紹了三個繪製箱型圖與小提琴圖的套件。相較於 Matplotlib,Seaborn 和 Plotly Express 比較容易使用,而且這兩個的使用方式極為相似。另外,Plotly Express 還有互動式的工具列。