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)
这当然清楚哪个案例没有任何数据!
这是我的数据集:
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)
这当然清楚哪个案例没有任何数据!