2015-04-03 52 views
3

這裏是我的數據集:箱形圖和GROUPBY:問題與羣體和sharex

df 
    A B  C 
0 13 Yes False 
1 12 No True 
2 2 Yes True 
3 12 No False 
4 4 No True 
5 1 Yes True 
6 1 No False 
7 5 No True 
8 15 Yes False 

df2 
    A B  C 
0 13 Yes False 
1 12 No False 
2 11 No False 
3 15 Yes False 
4 12 No False 
5 21 Yes False 

這裏是一塊有問題的代碼:

fig, ax = plt.subplots(2,1, sharey="all", sharex="all") 
df2.boxplot("A", by=["B","C"], ax=ax[0]) 
df.boxplot("A", by=["B","C"], ax=ax[1]) 

這給 boxplot

問題我有,就是在右上角的箱形圖應該從右移到右,以便與(Yes, False)標籤對齊。

我認爲它來自sharex不關心xticklabels,而是xticks值(它是[1,2][1,2,3,4])的事實。我可以用df2.boxplot中的positions=[1,3]參數修復此問題。

問題是,如何解決這個問題,而沒有事先知道哪些組將不會被表示?

此外,這可能是一個熊貓或Matplotlib的錯誤,或者這種行爲是由於某些原因預計?

+0

你嘗試從這裏回答:http://stackoverflow.com/questions/25284859/grouping-boxplots-in-seaborn-when-input-is-a-dataframe? – cphlewis 2015-04-03 21:13:15

回答

2
import seaborn as sns 
import pandas as pd 
df = pd.DataFrame([[13, 'Yes', False], 
     [12, 'No', True], 
     [2, 'Yes', True], 
     [12, 'No', False], 
     [4, 'No', True], 
     [1, 'Yes', True], 
     [1, 'No', False], 
     [5, 'No', True], 
     [15, 'Yes', False]], 
     columns = list('ABC')) 
df2 = pd.DataFrame([[13, 'Yes', False], 
     [12, 'No', False], 
     [11, 'No', False], 
     [15, 'Yes', False], 
     [12, 'No', False], 
     [21, 'Yes', False]], 
     columns = list('ABC')) 
df['i'] = 1 
df2['i'] = 2 
dfb = pd.concat([df,df2]) 
dfb['B,C'] = map(lambda x,y: '%s, %s'%(str(x),str(y)), dfb.B, dfb.C) 
dfb2 = pd.DataFrame(dfb, columns=['A','i','B,C']) 
sns.factorplot('B,C', row='i',y='A', kind='box', data=dfb2) 

enter image description here

添加的標識符i到每個數據幀來區分它們一旦連接在一起,並結合現有變量B, C所以我可以將它們作爲在x參數factorplot。那是試圖重現你的身材。讓factorplot多做一點吧:

dfc = pd.concat([df,df2]) 
sns.factorplot('B', row='i', col='C', y='A', kind='box', data=dfc) 

enter image description here

這當然清楚這種情況下,沒有任何數據!