如何为数据帧中的所有列绘制 Seaborn Distplot 矩阵



假设我有一个包含 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()

您可以使用这样的子图使用 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)

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

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

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

来自BenCaldwell的评论"i//ncols给出了地板划分,这是当你从左到右然后从上到下工作时的行。 i%ncols 将为您提供整数余数,即您从左到右从上到下工作时的列。

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

比 @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])

这应该有效:

fig, axes = plt.subplots(nrows = 3, ncols = 3)    # axes is 2d array (3x3)
axes = axes.flatten()         # Convert axes to 1d array of length 9
fig.set_size_inches(15, 15)
for ax, col in zip(axes, train.columns):
sns.distplot(train[col], ax = ax)
ax.set_title(col)

最新更新