Python 箱型圖/小提琴圖(Box/Violin Plot)

Photo by Kazuo ota on Unsplash
Photo by Kazuo ota on Unsplash
箱型圖(Box Plots)/小提琴圖(Violin Plots)是一個能夠很好地表現資料的分佈情況的統計圖。我們將在本文章中介紹如何用 Python 的 Matplotlib、Seaborn、和 Plotly Express 套件來繪製箱型圖與小提琴圖。

箱型圖(Box Plots)小提琴圖(Violin Plots)是一個能夠很好地表現資料的分佈情況的統計圖。我們將在本文章中介紹如何用 Python 的 Matplotlib、Seaborn、和 Plotly Express 套件來繪製箱型圖與小提琴圖。

完整程式碼可以在 下載。

概念

在開始用 Python 來繪製圖表之前,先讓我們了解一下箱型圖和小提琴圖的構造。

箱型圖(Box Plots)

下圖顯示箱型圖的構造。

Box Plots
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)

小提琴圖和箱型圖一樣可以顯示資料的分佈情況。此外,它還顯示出概率密度。下圖為它們的對照圖。

Violin Plots
Violin Plots

範例的資料集

本文章的範例都使用 seaborn 的 tips 資料集。下面的範例展示如何讀取資料集,並顯示資料集的欄位。

import seaborn as sns

tips = sns.load_dataset('tips')
tips.head()
total_billtipsexsomkerdaytimesize
016.991.01FemaleNoSunDinner2
110.341.66MaleNoSunDinner3
221.013.50MaleNoSunDinner3
323.683.31MaleNoSunDinner2
424.593.61FemaleNoSunDinner4

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()
Matplotlib box plot
Matplotlib box plot

在這範例中,我們可以看到 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()
Matplot horizontal box plot
Matplot horizontal box plot

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()
Matplotlib violin plot
Matplotlib violin plot

從範例中我們可以看出其實繪製小提琴圖也是很簡單地,只是 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()
Matplotlib horizontal violin plot
Matplotlib horizontal violin plot

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 box plot
Seaborn box plot

Seaborn 果然是相當地好用。它自動使用欄位的名稱來當作資料集的標籤。範例中,我們來設定參數 palette 來使用不同的 color map。

接下來的範例顯示搭配參數 x 和 y 的使用方法。

sns.boxplot(data=tips, x='day', y='total_bill', palette='Set2')
Seaborn box plot
Seaborn box plot

在這範例中,我們設定參數 x 為 day 欄位。boxplot() 就會使用 day 欄位的資料,並且將資料分群,所以變成有四個資料。這可以用在當你想要顯示某的資料中,各個值的分佈情況。

下面的範例顯示如何繪製水平的箱型圖。

sns.boxplot(data=tips, x='total_bill', y='day', palette='Set2')
Seaborn horizontal box plot
Seaborn horizontal box plot

Seaborn 會自動判斷資料的型態來選擇要繪製水平或是垂直的箱型圖。當然,你也可以使用參數 orient 來直接指定水平或是垂直。

最後一個範例則是顯示參數 hue 的使用方法。

sns.boxplot(data=tips, x='day', y='total_bill', hue='smoker')
Seaborn grouped box plot
Seaborn grouped box plot

參數 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')
Seaborn violin plot
Seaborn violin plot

接下來的是搭配參數 x 和 y 的範例。

sns.violinplot(data=tips, x='day', y='total_bill', palette='Set2')
Seaborn violin plot
Seaborn violin plot

下面顯示水平的小提琴圖。

sns.violinplot(data=tips, x='total_bill', y='day', palette='Set3')
Seaborn horizontal violin plot
Seaborn horizontal violin plot

下面的範例是顯示參數 hue 的使用方法。

sns.violinplot(data=tips, x='day', y='total_bill', hue='smoker')
Seaborn grouped violin plot
Seaborn grouped violin plot

最後來看一下參數 split 的使用範例。

sns.violinplot(data=tips, x='day', y='total_bill', hue='smoker', split=True)
Seaborn split grouped violin plot
Seaborn split grouped violin plot

筆者個人覺得 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')
Plotly Express box plot
Plotly Express box plot

box() 的用法與相當地簡單而且直覺。

下一個範例是搭配參數 x 與 y 的使用方法。

px.box(tips, x='day', y='total_bill', title='Plotly Express Box Plot')
Plotly Express box plot
Plotly Express box plot

與 Seaborn 的一樣,當指定參數 x 為 day 時,它會將 day 欄位的資料做分群成為四組資料集。

box() 會根據資料的值的型態來決定要繪製水平或是垂直的箱型圖,其範例如下。

px.box(tips, x='total_bill', y='day', title='Plotly Express Box Plot')
Plotly Express horizontal box plot
Plotly Express horizontal box plot

接下來的範例顯示如何使用參數 color。

px.box(tips, x='day', y='total_bill', color='smoker', title='Plotly Express Box Plot')
Plotly Express grouped box plot
Plotly Express grouped box plot

參數 color 可以顯示兩組資料集,並且在右方顯示說明圖示。

最後的範例是顯示如何使用參數 points 來顯示資料的概率密度。

px.box(tips[['total_bill', 'tip']], title='Plotly Express Box Plot', points='all')
Plotly Express box plot with points
Plotly Express box plot with points

官網還有更多的箱型圖範例可供參考。

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')
Plotly Express violin plot
Plotly Express violin plot

下一個範例是搭配參數 x 與 y。

px.violin(tips, x='day', y='total_bill', title='Plotly Express Box Plot')
Plotly Express violin plot
Plotly Express violin plot

下面是水平小提琴圖的範例。

px.violin(tips, x='total_bill', y='day', title='Plotly Express Box Plot')
Plotly Express horizontal violin plot
Plotly Express horizontal violin plot

以下是參數 color 的使用範例。

px.violin(tips, x='day', y='total_bill', color='smoker', title='Plotly Express Box Plot')
Plotly Express grouped violin plot
Plotly Express grouped violin plot

最後一個範例是顯示如何使用參數 points。

px.violin(tips[['total_bill', 'tip']], title='Plotly Express Box Plot', points='all')
Plotly Express violin plot with points
Plotly Express violin plot with points

可以看出點的分佈與概率密度,其實小提琴圖本身就顯示出來了。所以,我們不太需要在小提琴圖上額外地再顯示點。

官網還有很多小提琴圖的範例可供參考。

結論

我們在本文章中介紹了三個繪製箱型圖與小提琴圖的套件。相較於 Matplotlib,Seaborn 和 Plotly Express 比較容易使用,而且這兩個的使用方式極為相似。另外,Plotly Express 還有互動式的工具列。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

You May Also Like