Boxplot和groupby:群组和sharex的问题

时间:2015-04-03 08:08:08

标签: python pandas matplotlib

这是我的数据集:

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

我的问题是,在上部子图中,右侧的箱线图应该从1向右移动以与(Yes, False)标签对齐。

我认为这是因为sharex并不关心xticklabels,而是关注xticks值([1,2][1,2,3,4])。我可以使用positions=[1,3]中的df2.boxplot参数解决此问题。

问题是,如果没有事先知道哪些群体不能被代表,我该如何解决这个问题?

此外,这可能是一个Pandas或Matplotlib错误,或者出于某种原因预期会出现这种情况吗?

1 个答案:

答案 0 :(得分: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-argument传递给factorplot。那是试图重现你的身材。让factorplot做更多的事情:

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

enter image description here

这肯定会说清楚哪个案例没有任何数据!