2017-05-04 30 views
1

我可以使用DataFrameGroupBy.boxplot(...)以下面的方式來創建一個箱線圖:爲什麼DataFrameGroupBy.boxplot方法在給定參數「subplots = True/False」時拋出錯誤?

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

這將產生以下圖片: enter image description here

這正是我想要的,除了不是做三個小區,我希望所有的小區都在一個小區裏(用不同的colo rs爲美國,歐元和FIJ)。我試過

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

但它所產生的誤差

KeyError: 'gene_id'

我認爲這個問題有事情做的事實,by="gene_id"發送到matplotlib箱線圖方法的關鍵字。如果有人有更好的方式來製作劇情,那麼可能是通過使用DataFrame.boxplot(?)來代替,請在這裏回答。非常感謝!

回答

2

要使用純pandas功能,我覺得你不應該GroupBy調用boxplot之前,而是在呼叫請求組由某些列boxplotDataFrame本身:

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

編輯如果你想要讓每個堆疊組別的盒狀圖/疊加每個gene_id的要考慮到以下 帳戶評論,這有點複雜(加上你可能會輸出相當醜陋的結果)。你不能用Seaborn,AFAIK做到這一點,但你可以直接使用position=參數給boxplot(see doc)。抓住它來產生正確的位置序列,以將盒子圖放置在你想要的地方,但你必須自己修復刻度標籤和圖例。

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而不是使用箱線圖。一個swarmplot繪製每個點而不是boxplots的綜合表示,但是您可以使用參數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,所以我無法承擔將這些隊列並排的空間。相反,他們需要垂直堆疊在一起。也許Seaborn允許這樣做? – ecneicS

+0

@ecneicS我已經完成了我的回答,請查看 –

+0

太棒了。謝謝! – ecneicS

相關問題