使用 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