如何为数据框中的所有列绘制 Seaborn Distplots 矩阵

pyt*_*bie 12 python pandas seaborn

想象一下,我有一个包含 9 列的数据框。我希望能够达到与 df.hist() 相同的效果,但使用 sns.distplot()。

换句话说,我希望能够在 3 行 3 列的可视化中绘制数据框中每一列的 sns.distplot(),其中每个子图代表每列的唯一 sns.distplot() 总计数据框中的列数。

我对数据框的轴和列使用 for 循环进行了一些试验,但我只能获得指定列的结果。我不确定如何表示适用于行和列的代码。

我还研究了 sns.FacetGrid,但我不确定如何使用 FacetGrid 解决这个问题。

我发现 df.hist() 函数正是我想要的,但我希望能够使用 sns.distplot 来完成与 df.hist() 输出相同的表示形式中的所有列。

如果它有助于放置数据框的上下文,我基本上是在阅读 Google Colab 的加利福尼亚住房数据集的训练和测试集,其中包含除 Ocean_proximity 之外的所有列。如果您想使用该数据集帮助我解决这个问题,请从 Kaggle 获取并删除 Ocean_proximity 列。

我的 9 列方法:

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

df = pd.read_csv('housing.csv')
df.drop('ocean_proximity', axis=1, inplace=True)
fig, axes = plt.subplots(ncols=len(df.columns), figsize=(30,15))
for ax, col in zip(axes, df.columns):
  sns.distplot(df[col], ax=ax)
  plt.tight_layout() 
plt.show()
Run Code Online (Sandbox Code Playgroud)

Bru*_*ain 17

您可以使用像这样的子图使用 matplotlib 创建多个图形

import matplotlib.pyplot as plt
# Define the number of rows and columns you want
n_rows=3
n_cols=3
# Create the subplots
fig, axes = plt.subplots(nrows=n_rows, ncols=n_cols)
Run Code Online (Sandbox Code Playgroud)

您可以将子图函数视为创建形状为 [n_rows, n_cols] 的矩阵(二维数组),并使用矩阵元素的坐标来选择绘制位置。

然后使用ax参数在不同的子图中绘制每一列,以给出矩阵元素的坐标。使用ax=axes[i,j]将指定要打印的子图:

for i, column in enumerate(df.columns):
    sns.distplot(df[column],ax=axes[i//n_cols,i%n_cols])
Run Code Online (Sandbox Code Playgroud)

从 BenCaldwell 评论“i//ncols 给出了楼层划分,即当您从左到右然后从上到下工作时的行。i%ncols 将给您整数余数,即当您从左到右从上到下工作时的列底部。”

如果要绘制离散数据集而不是使用 distplot 来估计数据背后的数据分布,则可以使用新的histplot函数。


Jos*_*oad 7

在我看来,比 @Bruce Swain 的解决方案稍微优雅一些​​:

import matplotlib.pyplot as plt
import seaborn as sns

for i, column in enumerate(df.columns, 1):
    plt.subplot(3,3,i)
    sns.histplot(df[column])
Run Code Online (Sandbox Code Playgroud)