Boxplot 和 groupby:关于 groups 和 sharex 的问题

Boxplot and groupby: Issue with groups and 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])

这给出了

我遇到的问题是,在上面的子图中,右侧的箱线图应向右移动 1 以与 (Yes, False)标签。

我认为这是因为 sharex 不太关心 xticklabels,而是 xticks 值([1,2][1,2,3,4])。我可以使用 df2.boxplot.

中的 positions=[1,3] 参数来解决这个问题

问题是,如果事先不知道哪些组不会被代表,我该如何解决这个问题?

此外,这可能是 Pandas 或 Matplotlib 错误,还是出于某种原因预期会出现这种行为?

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)

向每个数据帧添加了一个标识符 i 以在连接后区分它们,合并现有变量 B, C 这样我就可以将它们作为 x 参数传递给 factorplot。那是试图重现你的身材。让 factorplot 多做一点:

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

这当然清楚哪个案例没有任何数据!