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

时间:2015-10-03 13:45:04

标签: python numpy pandas seaborn

我有一个dataFrame,它有多列和多行。很多行没有列的值,所以在数据框中它表示为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函数为这个dataFrame绘制直方图,所以我尝试了以下几行,

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

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

3 个答案:

答案 0 :(得分:4)

我们假设我从上面显示的数据中摘录(只是在我的机器上NAN只有NaN)。

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

为了做到这一点,你需要先在R客厅“融化”你的数据,即让它“长”。然后,您可以继续绘图。

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

enter image description here

请告诉我们这是否是您所追求的情节类型。

答案 1 :(得分:4)

我还认为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])

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

Generated image from code above (using different data set)

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

答案 2 :(得分:3)

我有类似的问题,因为我的 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

enter image description here