首页 > 解决方案 > 如何使用 seaborn 绘制单变量分布(仅对角线对角线)?

问题描述

仅使用 seaborn 绘制数据帧的单变量分布的更 Pythonic 方式是哪种?

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

data = pd.DataFrame(
     np.random.normal(0,1,size=(15,3)),
     columns = ["A","B","C"]
)

sns.pairplot(data) # shows univariate distribution in the diagonal but add other plots 
plt.show()

结果 :

代码结果

我想避免绘制不在对角线上的其他图。我可以使用 matplotlib 和 subplots 来做到这一点,但我确实认为有一种基于 seaborn 的更 Pythonic 和更漂亮的方式来实现这一点。我阅读了文档并找到sns.FacetGrid了可能有帮助的(?),但我不知道如何使用它。我不明白它的参数col...

有人能帮我吗 ?非常感谢 !

标签: pythonpandasseaborn

解决方案


您需要先将数据转长,以便可以将列拆分为构面:

data.melt()

    variable    value
0   A   -0.510632
1   A   0.634505
2   A   1.158468
3   A   1.095242
4   A   -0.105571
5   A   1.385932
6   A   1.305856
7   A   -1.100260
8   A   -0.829865
9   A   1.094065
10  A   -0.380359
11  A   -1.394960
12  A   0.263192
13  A   -0.889774
14  A   0.427633
15  B   -0.983942
16  B   -0.109396
17  B   -0.392132
18  B   0.869097
19  B   0.921728
20  B   0.837788
21  B   -0.279346
[...]

您将其传递给FacetGrid并调用histplot

g = sns.FacetGrid(data.melt(), col="variable")
g.map(sns.histplot, "value")

在此处输入图像描述

使用最新版本的 seaborn,您可以调用displot,正如@mwaskom 评论的那样:

sns.displot(data.melt(),col="variable",x="value",aspect=0.6)

在此处输入图像描述


推荐阅读