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

时间:2019-03-28 02:20:30

标签: 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()

3 个答案:

答案 0 :(得分:4)

比@Bruce Swain 的解决方案更优雅的 imo:

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

答案 1 :(得分:1)

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

import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=3, ncols=3)

然后,您可以使用ax = axes [nrow,ncol]指定要在其中打印的子图,并使用ax参数在不同的子图中绘制各列:

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

答案 2 :(得分:0)

这应该有效:

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)