Pandas DataFrame.hist Seaborn 等价物

Posted

技术标签:

【中文标题】Pandas DataFrame.hist Seaborn 等价物【英文标题】:Pandas DataFrame.hist Seaborn equivalent 【发布时间】:2020-07-21 15:55:15 【问题描述】:

在探索时,我经常使用 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()

这会为每列生成一个带有单独图的图形:

我尝试了以下方法:

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

但这会产生一个带有单个图并且所有列都覆盖的图形:

有没有办法使用 Seaborn 生成直方图网格,显示来自 DataFrame 列的数据?

【问题讨论】:

【参考方案1】:

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

g = sns.FacetGrid(df.melt(), col='variable', col_wrap=2)
g.map(plt.hist, 'value')

【讨论】:

谢谢,这看起来是获得接近 df.hist() 的最干净的方法 为了使直方图更易于比较,您可以使用 sns.histplot 而不是 plt.hist 设置 bin 宽度,如下所示:g.map(sns.histplot, 'value', binwidth=0.5)。或者,如果您更喜欢选择一定数量的 bin 来覆盖整个值范围,您可以改用:_, bin_edges = np.histogram(df.melt()['value'], bins=10); g.map(sns.histplot, 'value', bins=bin_edges)(使用 seaborn v. 0.11.0 测试)【参考方案2】:

没有等价的 seaborn displot 本身只会选择一维数组或列表,也许您可​​以尝试生成子图。

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

【讨论】:

谢谢你,这产生了一些接近我所追求的东西。【参考方案3】:

https://seaborn.pydata.org/examples/distplot_options.html

这是一个示例,您如何使用子图和 seaborn 显示 4 个图表。

【讨论】:

您分享的页面上的图片链接已损坏,distplot 在当前版本的 seaborn 中似乎已被弃用。您是否愿意分享一个指向另一个工作示例的新链接,或者自己使用一些代码重新创建图像并在此处分享结果以便人们可以使用它?【参考方案4】:

另一种有用的 SEABORN 方法可以为您快速显示数据框中每个数字列的直方图网格,它可能是快速、干净和方便的 sns.pairplot()

尝试: sns.pairplot(df) 这有很多很酷的参数,你可以像 Hue 等一样探索

pairplot example for iris dataset

如果您不想要散点图,您实际上可以使用sns.PairGrid(df) 非常快速地创建自定义网格 这会创建一个包含所有空格的空网格,您可以在其上映射任何您想要的内容:g = sns.pairgrid(df)

`g.map(sns.distplot)` or `g.map_diag(plt.scatter)`

【讨论】:

【参考方案5】:

我最终调整了 jcaliz 以使其更普遍地工作,即不仅仅是当 DataFrame 有四列时,我还添加了代码以删除任何未使用的轴并确保轴按字母顺序显示(与 df.hist() 一样)。

size = int(math.ceil(len(df.columns)**0.5))
fig, ax = plt.subplots(size, size, figsize=(10, 10))

for i in range(ax.shape[0]):
    for j in range(ax.shape[1]):
        data_index = i*ax.shape[1]+j
        if data_index < len(df.columns):
            sns.distplot(df[df.columns.sort_values()[data_index]], ax=ax[i][j])

for i in range(len(df.columns), size ** 2):
    fig.delaxes(ax[i // size][i % size])

【讨论】:

以上是关于Pandas DataFrame.hist Seaborn 等价物的主要内容,如果未能解决你的问题,请参考以下文章

迭代对象数组python

pandas.scatter_matrix 函数开始绘制模糊和损坏的图

Sea.js学习1——初识Sea.js

sea.js简单使用教程

Sea.js学习4——Sea.js的配置

Sea.js学习2——Sea.js的API 快速参考