2017-05-04 1 views
1

私は次のように箱ひげ図を作成するためにDataFrameGroupBy.boxplot(...)を使用することができます。 enter image description here引数 "subplots = True/False"が指定されていると、DataFrameGroupBy.boxplotメソッドでエラーが発生するのはなぜですか?

In [15]: df = pd.DataFrame({"gene_length":[100,100,100,200,200,200,300,300,300], 
...:      "gene_id":[1,1,1,2,2,2,3,3,3], 
...:      "density":[0.4,1.1,1.2,1.9,2.0,2.5,2.2,3.0,3.3], 
...:      "cohort":["USA","EUR","FIJ","USA","EUR","FIJ","USA","EUR","FIJ"]}) 

In [17]: df.groupby("cohort").boxplot(column="density",by="gene_id")

In [18]: plt.show()

これは、次の画像を生成します

これはまさに私が望むものです.3つのサブプロットを作る代わりに、すべてのプロットを1つのプロットにしたい米国、EUR、およびFIJの場合はrs)。私は

In [17]: df.groupby("cohort").boxplot(column="density",subplots=False,by="gene_id")

を試みたが、それは誤り

KeyError: 'gene_id'

私は問題はby="gene_id"はmatplotlibのを箱ひげ図の方法に送られたキーワードがあるという事実とは何かを持っていると思うが生成されます。誰かが私が後になっているプロットを作成する良い方法を持っている場合は、DataFrame.boxplot(?)を代わりに使用して、ここで回答してください。本当にありがとう!

答えて

2

純粋pandas機能を使用するには、私はboxplotを呼び出す前に、あなたがGroupByいけないと思いますが、その代わり、DataFrame自体のboxplotへの呼び出しで特定の列によってグループに要請:

df.boxplot(column='density',by=['gene_id','cohort']) 

enter image description here

より良い結果を得るには、Seabornライブラリの使用を検討してください。タスクのこの種を正確に役立つように設計されています

sns.boxplot(data=df,x='gene_id',y='density',hue='cohort') 

enter image description here

EDITをあなたのコホート箱ひげ図のそれぞれが各gene_idのために重畳/積み重ねられているしたい場合は 下記の口座のコメントに取ります、それはもう少し複雑です(あなたはかなり醜い出力に終わるかもしれません)。 Seaborn、AFAIKを使用してこれを行うことはできませんが、boxplot(see doc)にposition=パラメータを使用して、パンダで直接行うことはできます。それをキャッチすることで、正確な位置のシーケンスを生成し、必要な場所にボックスプロットを配置できますが、ティックラベルと凡例を自分で修正する必要があります。

pos = [i for i in range(len(df.gene_id.unique())) for _ in range(len(df.cohort.unique()))] 
df.boxplot(column='density',by=['gene_id','cohort'],positions=pos) 

enter image description here

の代替ではなく、箱ひげ図を使用してのseaborn.swarmplotを使用することです。スウォムプロットはボックスプロットの合成表現の代わりにすべての点をプロットしますが、パラメータsplit=Falseを使用して、コホートで色付けされたポイントを各gene_idごとに重ねることができます。あなたのデータフレームの実際の内容を知らず

sns.swarmplot(data=df,x='gene_id',y='density',hue='cohort', split=False) 

enter image description here

(遺伝子あたりおよびコホートごとのポイント数、およびそれらがどのように各コホートである分離)、それはほとんどのだろうどのソリューションと言うのは難しいです適切な。

+0

ありがとうございます。これは、私が作ったおもちゃのデータセット、特にSeabornライブラリにとって最適なソリューションです。残念ながら、私のデータセットは90個の遺伝子IDを持っていますので、コホートを並べて並べる余裕はありません。代わりに、彼らはお互いの上に垂直に積み重ねる必要があります。多分シーボーンはこれを許しますか? – ecneicS

+0

@ecneicS私の答えを完了しました、それをチェックしてください –

+0

素晴らしいです。ありがとうございました! – ecneicS

関連する問題