22

複数の列を a にプロットし、すべてをinsidepandas dataframeを使用して別の列でグループ化するつもりです。ここには、matplotlib の同様の問題に対する良い答えがあります: Group boxplots ですが、オプションが付属しているという事実を考えると、 .groupbyseaborn.boxplotmatplotlib seaborn.boxplotgroupbyseaborn

ここでは、失敗する再現可能な例を示します。

import seaborn as sns
import pandas as pd
df = pd.DataFrame(
[
[2, 4, 5, 6, 1],
[4, 5, 6, 7, 2],
[5, 4, 5, 5, 1],
[10, 4, 7, 8, 2],
[9, 3, 4, 6, 2],
[3, 3, 4, 4, 1]
], columns=['a1', 'a2', 'a3', 'a4', 'b'])

#Plotting by seaborn
sns.boxplot(df[['a1','a2', 'a3', 'a4']], groupby=df.b)

私が得るのは、groupbyオプションを完全に無視するものです:

グループ化に失敗しました

一方、1 つの列でこれを行うと、別の SO の質問Seaborn groupby pandas Seriesのおかげで機能します。

sns.boxplot(df.a1, groupby=df.b)

失敗しないシーボーン

したがって、すべての列を 1 つのプロットにまとめたいと思います (すべての列は同様のスケールになります)。

編集:

上記のSOの質問は編集され、この問題に対する「クリーンではない」回答が含まれるようになりましたが、誰かがこの問題についてより良いアイデアを持っているといいでしょう.

4

5 に答える 5

27

他の回答が指摘しているように、boxplot関数は箱ひげ図の単一の「レイヤー」をプロットすることに限定されており、groupbyパラメーターは入力がシリーズであり、観測を各ボックスにビン化するために使用する2番目の変数がある場合にのみ効果があります..

factorplotただし、を使用して、関数で期待していると私が思うことを達成できますkind="box"。ただし、最初にサンプル データフレームを、各列が変数で各行が観測値である長い形式または「きちんとした」形式と呼ばれるものに「溶かす」必要があります。

df_long = pd.melt(df, "b", var_name="a", value_name="c")

次に、プロットするのは非常に簡単です。

sns.factorplot("a", hue="b", y="c", data=df_long, kind="box")

ここに画像の説明を入力

于 2014-08-13T14:39:07.427 に答える
6

Seaborn の groupby 関数は DataFrame ではなく Series を使用するため、機能していません。

回避策として、これを行うことができます:

fig, ax = plt.subplots(1,2, sharey=True)
for i, grp in enumerate(df.filter(regex="a").groupby(by=df.b)):
    sns.boxplot(grp[1], ax=ax[i])

それは与えます :SNS

df.filter(regex="a")と同等であることに注意してくださいdf[['a1','a2', 'a3', 'a4']]

   a1  a2  a3  a4
0   2   4   5   6
1   4   5   6   7
2   5   4   5   5
3  10   4   7   8
4   9   3   4   6
5   3   3   4   4

お役に立てれば

于 2014-08-13T14:16:07.840 に答える
6

直接使用できますboxplot(質問があったとき、それは不可能だったと思いますが、seabornバージョン> 0.6では可能です)。

@mwaskom で説明されているように、サンプル データフレームを「長い形式」に「溶かす」必要があります。各列は変数で、各行は観測値です。

df_long = pd.melt(df, "b", var_name="a", value_name="c")

次に、それをプロットするだけです:

sns.boxplot(x="a", hue="b", y="c", data=df_long)

boxplot で得られたプロット

于 2019-06-07T17:36:22.167 に答える
5

リンクした回答よりも実際には優れていませんがFacetGrid、boxplot関数に渡されるシリーズに対してのみgroupbyパラメーターが定義されているため、seabornでこれを達成する方法は機能を使用していると思います。

ここにいくつかのコードがあります - これpd.meltが必要なのは、(私が知る限り) ファセット マッピングが個々の列のみをパラメーターとして受け取ることができるため、データを「長い」形式に変換する必要があるためです。

g = sns.FacetGrid(pd.melt(df, id_vars='b'), col='b')
g.map(sns.boxplot, 'value', 'variable')

ファセットシーボーンボックスプロット

于 2014-08-13T11:55:26.840 に答える