使用 Seaborn 的小提琴圖

Manav Narula 2024年2月15日
使用 Seaborn 的小提琴圖

violinplot() 函式建立了這樣一個圖,並像核密度圖和箱線圖之間的組合一樣描述了分佈。分析和統計人員大量使用它來了解分類資料的分佈。與傳統箱線圖相比,它的主要優勢在於它們也可用於具有多個峰值的分佈。

圖中的小提琴圖可能有點難以理解,但它可以描繪不同的統計值。下圖將對此進行解釋。

小提琴圖資訊

除了 DataFrames,violinplot() 函式可以處理單個系列物件、numpy 陣列或列表向量。

在以下示例中,我們將繪製單個變數的小提琴圖分佈。

import random
import numpy as np

n = random.sample(range(0, 50), 30)
arr = np.array(n)
sns.violinplot(n)

seaborn 中的小提琴圖

請注意,樣本大小對小提琴圖中的最終數字有巨大影響。對於小樣本量,該圖可能會產生誤導。如果這仍然有點令人困惑,可以在小提琴圖上繪製一個簡單的散點圖以獲得更好的理解。

例如,

import random
import numpy as np

n = random.sample(range(0, 50), 30)
arr = np.array(n)
sns.violinplot(n)
sns.stripplot(n, color="red")

具有不同樣本量的 seaborn 中的小提琴圖

此處的 stripplot() 函式在小提琴圖上繪製散點圖。同樣,你還可以在小提琴圖上繪製箱線圖,以瞭解兩者之間的相似性和差異性。

violinplot() 主要用於資料集,顯示具有多個類別的資料分佈。在下面的程式碼中,我們將實現這一點。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame(
    {
        "Quantity": [5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8],
        "Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
        "Day": [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2],
        "Product": [
            "A",
            "A",
            "A",
            "A",
            "B",
            "B",
            "B",
            "B",
            "A",
            "A",
            "A",
            "A",
            "B",
            "B",
            "B",
            "B",
        ],
    }
)

sns.violinplot(data=df, y="Price", x="Quantity", hue="Product")

seaborn 中的小提琴圖顯示了資料分佈

請注意我們如何能夠有效地繪製兩天內不同數量的兩種不同產品的價格分佈。請注意使用 hue 引數繪製具有不同顏色的兩個產品。

許多其他引數可用於調整和修改最終圖形。我們可以使用 split 引數輕鬆比較類別。可以使用 order 引數管理它們的順序。可以使用 inner 引數在圖中顯示每個觀察結果。

在下面的程式碼中,我們嘗試使用其中一些引數。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame(
    {
        "Quantity": [5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8],
        "Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
        "Day": [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2],
        "Product": [
            "A",
            "A",
            "A",
            "A",
            "B",
            "B",
            "B",
            "B",
            "A",
            "A",
            "A",
            "A",
            "B",
            "B",
            "B",
            "B",
        ],
    }
)

sns.violinplot(
    data=df, y="Price", x="Quantity", hue="Product", inner="stick", split=True
)

帶有內引數的 seaborn 中的小提琴圖

violinplot() 函式返回一個 matplotlib 軸型別物件,以使用所有此類 matplotlib 函式來自定義最終圖形。如果我們想返回一個 FacetGrid 型別的物件,我們可以使用 catplot() 函式並將 kind 引數指定為 violin

作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn