这是我的数据集:
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]
)。我可以使用positions=[1,3]
中的df2.boxplot
参数解决此问题。
问题是,如果没有事先知道哪些群体不能被代表,我该如何解决这个问题?
此外,这可能是一个Pandas或Matplotlib错误,或者出于某种原因预期会出现这种情况吗?
答案 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)
为每个数据帧添加了一个标识符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)
这肯定会说清楚哪个案例没有任何数据!