web-dev-qa-db-ja.com

データフレームに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

このエラーを取り除くための助け/提案は大歓迎です.. !!!

6
user1017373

また、 seaborn document は、複数の列を同時にプロットし、デフォルトで色で強調表示できると述べていると思いました。

しかし、読み直しても何も見えませんでした。代わりに、私はそれを このチュートリアル から推測したと思います。途中で、チュートリアルは複数の列を持つデータフレームをプロットします。


ただし、「解決策」は簡単であり、うまくいけば、まさにあなたが探しているものです。

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)

注:自分のデータセットを再作成する方法がわからなかったため、別のデータセットを使用しました。

5
Mike Williamson

私のpandas.DataFrameにはタイプObjectの要素があったため、同様の問題が発生しましたプロットしたい列に(my_column)。そのため、コマンドは次のようになります。

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

4
Ivan Zhovannik

上に示したデータからの抜粋があると仮定しましょう(私のマシンではNANNaNであるという違いだけがあります)。

次に、私が考えることができる最良のグラフィック表現は、グループ化されたバープロットです。サンプルごとに1つのグループ、すべてのグループ内に遺伝子バーがあります(このヒストグラムを時々呼ぶ人もいます)

これを行うには、最初に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

これがあなたが求めていたタイプのプロットであるかどうかをお知らせください。

4