Pandas DataFrame.hist Seaborn 等效项

Ala*_*irm 5 python pandas seaborn jupyter-notebook

在探索时,我经常使用 Pandas 的 DataFrame.hist() 方法来快速显示数据框中每个数字列的直方图网格,例如:

import matplotlib.pyplot as plt
import pandas as pd
from sklearn import datasets


data = datasets.load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)

df.hist(bins=50, figsize=(10,7))
plt.show()
Run Code Online (Sandbox Code Playgroud)

这会生成一个图形,其中每列都有单独的图: 这会生成一个图形,其中每列都有单独的图

我尝试过以下方法:

import pandas as pd
import seaborn as sns
from sklearn import datasets


data = datasets.load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)

for col_id in df.columns:
    sns.distplot(df[col_id])
Run Code Online (Sandbox Code Playgroud)

但这会产生一个只有一个图且所有列都重叠的图形: 但这会产生一个只有一个图且所有列都重叠的图形

有没有办法用 Seaborn 生成一个直方图网格来显示 DataFrame 列中的数据?

bus*_*ear 5

如果您使用 重新组织数据框,则可以利用 seaborn 的 FacetGrid melt。Seaborn 通常期望以这种方式组织数据(长格式)。

g = sns.FacetGrid(df.melt(), col='variable', col_wrap=2)
g.map(plt.hist, 'value')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


jca*_*liz 4

没有等效的,因为seaborndisplot本身只会选择一维数组或列表,也许你可以尝试生成子图。

fig, ax = plt.subplots(2, 2, figsize=(10, 10))

for i in range(ax.shape[0]):
    for j in range(ax.shape[1]):
        sns.distplot(df[df.columns[i*2+j]], ax=ax[i][j])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述