Press "Enter" to skip to content

在Python中,替代Seaborn Distplot的最佳选择

数据科学

Seaborn Distplot已经被弃用,让我们探索它的替代方案

Photo by Bon Vivant on Unsplash

Seaborn是Python中著名的数据可视化库。

由于它是建立在matplotlib之上的,并且与pandas数据结构完美配合,所以在使用Python处理数据时非常方便,因为它将数据转换为有见地的可视化形式,有助于聚焦于所需信息并更快地掌握结果。

然而,每个库都会随着时间的推移而发展,Seaborn也是如此。

当我在项目中使用Seaborn创建分布图时,我遇到了以下函数弃用警告。

Image by Author

因此,我开始寻找替代方案,并在今天分享我的发现。

在这篇快速阅读中,您将了解为什么Seaborn弃用了令人惊叹的函数distplot(),它的当前最佳替代方案以及如何使用它来创建与distplot()相同的图形。

以下是内容的一瞥——

· Seaborn中的Distplot · 为什么Seaborn Distplot被弃用? · Seaborn Distplot()的替代方案是什么? Seaborn中的displot() · 使用Seaborn中的displot()的实例 双变量分布 使用子数据集的图形

我使用UCI机器学习存储库中的Dry Beans数据集,这个数据集在CC BY 4.0许可下可用,用了一些很棒的例子来使本文更有趣。

Dry Beans数据集 | 图片由作者提供

让我们开始吧!

在查看替代方案之前,让我们先了解函数distplot()及其有用之处。

Seaborn中的Distplot

Distplot()是Seaborn库中的多功能函数,广泛用于单变量数据分析。它可以帮助您在同一个可视化中创建直方图和核密度估计(KDE)图。

什么是单变量数据分析?

它用于探索单个变量的特征和分布,而不考虑数据集中其他变量之间的关系。

因此,回到distplot(),它由直方图和KDE图组成。

distplot()中的直方图显示落入不同桶即箱子的数据点的频率或计数。

整个数据点系列或列表被分成相同大小的不同桶。可视化通常是一个条形图,其中X轴通常是桶或箱子,Y轴表示桶中的数据点数量。

这样的图形可以帮助您了解数据如何分布在不同的值范围内。

而KDE图则可以帮助您通过分析潜在的概率分布函数来可视化变量的分布。简单地说,它可以帮助您了解在不同的桶或箱子中观察数据点的可能性。

使用KDE图,您可以了解数据分布的形状、峰值和传播情况。

例如,让我们在列“Perimeter”上使用distplot()函数。

import pandas as pdimport seaborn as snsdf = pd.read_excel("Dry_Bean_Dataset.xlsx")sns.distplot(df["Perimeter"])
Seaborn distplot() | Image by Author

如上图所示,条形图表示直方图,而平滑线是KDE图。

如我所述,distplot()在已创建的直方图上创建一个KDE图,这就是为什么在Y轴上可以看到概率密度值的原因。

不要将概率与概率密度混淆!

您需要将每个概率密度值乘以曲线下的面积,以从每个概率密度值获得概率。

这样的KDE值只能用于不同桶之间的相对比较。

现在,让我们了解为什么您不应该在未来使用它。

为什么Seaborn Distplot已被弃用?

Distplot()是Seaborn库中添加的最早的几个函数之一,因此其函数定义与后期添加的其他函数明显不同。

以下是Seaborn官方文档中distplot()函数的定义。

seaborn.distplot(a=None, bins=None, hist=True, kde=True, rug=False,fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None,color=None, vertical=False, norm_hist=False, axlabel=None, label=None,ax=None, x=None)

Michael Waskom解释得非常准确-distplot()API既没有选择DataFrame列的x,y参数,也没有条件hue映射。

因此,当Seaborn开发人员在Seaborn v0.11.0中更新分布模块时,他们发现除了废弃distplot()以更符合其他分布图函数的一致性外,没有更好的方法。

结果,Seaborn distplot()在Seaborn v0.11.0中已被弃用。

调用此函数实际上不会阻止您创建图,但会发出我之前提到的弃用警告。

这就是我开始探索替代方案的原因。

Seaborn Distplot的替代方案是什么?

Seaborn文档建议两种替代方案-displot()histplot()。但是,我个人认为displot()是一个多才多艺的解决方案。

让我向您展示它与弃用的distplot()相比如何相似或不同。

Seaborn中的displot()

这是所有类型(单变量和双变量)分布图的一站式解决方案。您所需要做的就是传递一个DataFrame和要查看其分布的列名。

因此,要获取与上面类似的分布图,对于列“Perimeter”,您可以使用以下代码。

sns.displot(df, x="Perimeter")
Histogram using seaborn displot() | Image by Author

它只是创建了一个直方图,与已弃用的distplot()函数创建的直方图相同。您可以使用函数histplot()获取此类型的图,这是另一种弃用函数的替代方案。

但是关于KDE图呢?

您也可以使用displot()函数来得到一个KDE图。这时kind参数非常有用。您可以将kde赋值给kind参数,得到如下的核密度估计图。

sns.displot(df, x="Perimeter", kind='kde')
使用Seaborn displot()创建KDE图|作者:Image

到目前为止,一切都很好!

但是,您可能会有一个问题——displot()函数如何创建类似于使用distplot创建的图形,在直方图顶部绘制KDE的图形?

答案是kde参数。

正如您所看到的,默认情况下,displot()创建直方图。因此,要在直方图的顶部创建KDE图,可以将kde参数设置为True,如下所示。

sns.displot(df, x="Perimeter", kde=True)
使用displot()创建Seaborn直方图和KDE图|作者:Image

真正使displot函数不同于distplot的是上图的Y轴。

在弃用的distplot()函数中,Y轴代表概率密度,而在displot()函数中,Y轴代表计数,即每个bin中的数据点数。

Y轴上的计数可以立即有用,以了解哪个bin或值范围包含最多/最少的数据点,这在概率密度的情况下不是这种情况。

好的,displot()函数的灵活性并不止于此。让我向您展示您可以使用此函数做些什么,这在使用distplot()时不是一项容易的任务。

Seaborn中displot()的用例

displot()函数有许多可调整的参数,可以创建各种图形。

seaborn.displot(data=None, *, x=None, y=None, hue=None, row=None, col=None,                 weights=None, kind='hist', rug=False, rug_kws=None,                log_scale=None, legend=True, palette=None, hue_order=None,                hue_norm=None, color=None, col_wrap=None, row_order=None,                col_order=None, height=5, aspect=1, facet_kws=None, **kwargs)

您可以看到,在上述定义中,参数kind默认设置为'hist',这解释了为什么在未指定kind参数时,displot()创建直方图。

我不会深入探讨每个参数,但我必须提到一些有趣的参数。

双变量分布

displot()函数的能力可以让您从DataFrame和该DataFrame的X-Y轴变量中获得输入,因此在您想要获取两个变量的双变量分布(即两个变量的分布)时非常有用。

例如,假设您想要在考虑周长和圆度两个变量时获取数据点的分布。您只需在X和Y参数中简单地提到这些变量名,如下所示。

sns.displot(df, x="Perimeter", y="roundness")
使用Seaborn displot()创建双变量分布|作者:Image

上面的图表清楚地显示出数据点的最大数量位于周长在600到800之间、圆度大于0.85的黑暗区域。

因此,您可以为所有数字列获得这种二元分布。

但是对于分类列呢?

在数据集中,您可以看到有一个分类列——Class,它表示不同的豆类。您可以使用此变量创建数据的子集,然后使用displot轻松绘制。

使用数据子集绘图

在使用函数displot()时,您无需单独创建数据框的子集。您只需使用hue参数即可为每个数据子集创建直方图或KDE图。

让我们看看它的效果——

sns.displot(df, x="Perimeter", hue='Class')
Create histograms on the subset of data using Seaborn displot() | Image by Author

这就是您可以看到每个数据子集的不同直方图的方法。

如果您想在不同的子图上获得这些不同的直方图。在这种情况下,您应该使用col参数,如下所示。

sns.displot(df, x="Perimeter", col='Class')
Subplots using Seaborn displot() | Image by Author

以这种方式,displot()将创建与您拥有的不同子集一样多的子图。

您可以根据需要在项目中探索displot()中的其余参数。

我希望您会发现这篇文章有用。每个数据分析库随着时间的推移都会发生变化。因此,有些函数会过时,并被具有更好和更易于使用体验的改进函数所取代。

尽管Seaborn中的distplot()已过时,但它并未完全退出市场。您仍然可以使用它,但最好切换到更好的函数displot以获得不同的分布图表。

想阅读更多小猪AI的故事吗?

💡考虑成为小猪AI会员,以访问小猪AI上的无限故事和每日有趣的小猪AI通讯。我将获得您的一小部分费用,您不需要支付额外费用。

💡一定要注册并加入100多名其他成员,以不错过有关数据科学指南、技巧和提示以及SQL和Python的最佳实践的文章。

谢谢阅读!

数据集:Dry Beans Dataset 引用:Dry Bean Dataset. (2020). UCI Machine Learning Repository. https://doi.org/10.24432/C50S4B . 许可证:CC BY 4.0

Leave a Reply

Your email address will not be published. Required fields are marked *