使用 seaborn 为数据框绘制直方图

Posted

技术标签:

【中文标题】使用 seaborn 为数据框绘制直方图【英文标题】:Plotting histogram using seaborn for a dataframe 【发布时间】:2015-12-31 14:47:23 【问题描述】:

我有一个具有多列和多行的数据框。很多行没有列的值,因此在数据框中它表示为 NaN。 示例dataFrame如下,

df.head()
GEN Sample_1    Sample_2    Sample_3    Sample_4    Sample_5    Sample_6    Sample_7    Sample_8    Sample_9    Sample_10   Sample_11   Sample_12   Sample_13   Sample_14
A123    9.4697  3.19689 4.8946  8.54594 13.2568 4.93848 3.16809 NAN NAN NAN NAN NAN NAN NAN
A124    6.02592 4.0663  3.9218  2.66058 4.38232         NAN NAN NAN NAN NAN NAN NAN
A125    7.88999 2.51576 4.97483 5.8901  21.1346 5.06414 15.3094 2.68169 8.12449 NAN NAN NAN NAN NAN
A126    5.99825 10.2186 15.2986 7.53729 4.34196 8.75048 16.9358 5.52708 NAN NAN NAN NAN NAN NAN
A127    28.5014 4.86702 NAN NAN NAN NAN NAN NAN NAN NAN NAN NAN NAN NAN

我想使用 python 中的 seaborn 函数为这个数据帧绘制直方图,所以我尝试了以下几行,

sns.set(color_codes=True)
sns.set(style="white", palette="muted")
sns.distplot(df)

但它抛出以下错误,

    ValueError                                Traceback (most recent call last)
    <ipython-input-80-896d7fe85ef3> in <module>()
          1 sns.set(color_codes=True)
          2 sns.set(style="white", palette="muted")
    ----> 3 sns.distplot(df)

    /anaconda3/lib/python3.4/site-packages/seaborn/distributions.py in distplot(a, bins, hist, kde, rug, fit, hist_kws, kde_kws, rug_kws, fit_kws, color, vertical, norm_hist, axlabel, label, ax)
        210         hist_color = hist_kws.pop("color", color)
        211         ax.hist(a, bins, orientation=orientation,
    --> 212                 color=hist_color, **hist_kws)
        213         if hist_color != color:
        214             hist_kws["color"] = hist_color

   /anaconda3/lib/python3.4/site-packages/matplotlib/axes/_axes.py in hist(self, x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, **kwargs)
       5627             color = mcolors.colorConverter.to_rgba_array(color)
       5628             if len(color) != nx:
    -> 5629                 raise ValueError("color kwarg must have one color per dataset")
       5630 
       5631         # We need to do to 'weights' what was done to 'x'

    ValueError: color kwarg must have one color per dataset

任何帮助/建议摆脱此错误将不胜感激..!!!

【问题讨论】:

嗯,很明显,二维数组的直方图函数映射在一般情况下没有定义。如您所见,distplot 采用 1D arraySerieslist。您可以尝试传递color=X,其中X 是颜色映射字典,例如'Sample_1': 'Red', ...,但我严重怀疑它会起作用。 好的,我们可以将它与 seaborn 一起使用吗,如果你能在这里分享它会很好..我是 seaborn 绘图的初学者.. 我建议您避免为您的问题寻找 1-line 解决方案。从matplotlib 开始(seaborn 只是在matplotlib 上工作的一组高级工具)。对于您的任务,分配子图数组 (plt.subplots(nrows=?, ncols=?)),遍历 df 列并为每对 subplot + column 调用 matplotlibhist 不清楚你在问什么。您想要数据框中所有值的单个直方图吗?每列或每一行的单独直方图?您要问的内容当前未定义,这就是您看到错误的原因。 @user1017373 你能编辑问题吗?我只有在看到接受的答案后才能理解这个问题,但在目前的形式下,您的问题非常不清楚。 【参考方案1】:

我遇到了类似的问题,因为我的 pandas.DataFrame 在我想要绘制的列 (my_column) 中有 Object 类型的元素。这样命令:

print(df[my_column])

给了我:

Length: 150, dtype: object

解决办法是

sns.distplot(df[my_column].astype(float))

作为 my_column 的数据类型转换为:

Length: 150, dtype: float64

【讨论】:

【参考方案2】:

我还以为seaborn documentation 提到可以同时绘制多个列,并默认以颜色突出显示。

但重读后,我什么也没看到。相反,我想我是从 this tutorial 推断出来的,在此过程中,本教程绘制了一个包含多列的数据框。


但是,“解决方案”是微不足道的,希望正是您正在寻找的:

sns.set(color_codes=True)
sns.set(style="white", palette="muted")
sns.distplot(df)

for col_id in df.columns:
    sns.distplot(df[col_id])

默认情况下,这会改变颜色,“知道”哪个颜色已经被使用过。

注意:我使用了不同的数据集,因为我不确定如何重新创建您的数据集。

【讨论】:

【参考方案3】:

假设我有您上面显示的数据的摘录(唯一不同的是,在我的机器上 NANNaN)。

然后,我能想到的最好的图形表示是分组条形图:每个样本一组,每个组内都有基因条(有些人偶尔称之为直方图)

为此,您首先需要在R parlour 中“融化”您的数据,即使其“长”。然后,您可以继续绘图。

data = df.set_index('GEN').unstack().reset_index()
data.columns = ['sample','GEN', 'value']

sns.set(style="white")
g = sns.factorplot(x='sample'
                   ,y= 'value'
                   ,hue='GEN'
                   ,data=data
                   ,kind='bar'
                   ,aspect=2
                   )
g.set_xticklabels(rotation=30);

请让我们知道这是否是您所追求的情节类型。

【讨论】:

我一直在寻找直方图来绘制分布,但是谢谢

以上是关于使用 seaborn 为数据框绘制直方图的主要内容,如果未能解决你的问题,请参考以下文章

如何绘制从不同列着色的堆叠 seaborn 直方图

python 示例显示如何使用累积比绘制直方图。使用seaborn.FacetGrid()绘制多个直方图。

使用 Seaborn Python 绘制 CDF + 累积直方图

如何更改 seaborn 直方图以在一天中的几个小时内工作?

Python Seaborn 绘制空白直方图

在 seaborn displot/histplot 函数中绘制高斯拟合直方图(不是 distplot)