是否有一种使用Python Matplotlib在分组箱图上显示样本大小的好方法

时间:2015-03-26 18:31:34

标签: python matplotlib boxplot sample-size

我可以使用groupby获取大小信息,并将文本添加到相应的位置。但我无法帮助思考,这是一个更好的方式,因为这看起来很平凡,很多人都希望看到......

为了说明,以下代码将生成分组的boxplot

import pandas as pd
df = pd.DataFrame(rand(100, 1), columns=['value'])
df.ix[:23, 'class']='A'
df.ix[24:, 'class']='B'
df.boxplot(column='value', by='class')

boxplot 我想要的是分别显示每个A类和B类的样本大小,即24和76。它可能看起来像传说或在盒子附近的某个地方,对我来说也没关系。

谢谢!

1 个答案:

答案 0 :(得分:7)

类ticklabels中的

n 。我尝试过它作为一个传奇,但我不认为它是如此清晰。 R有更多的boxplot选项,包括使盒子的宽度与样本大小成比例;不是matplotlib中的默认值,但很容易看起来真可读:

import pandas as pd
from numpy.random import rand, randint

df = pd.DataFrame(rand(100, 1), columns=['value'])

cut1 = randint(2,47)
cut2 = randint(52, 97)
df.ix[:cut1, 'class']='A'
df.ix[cut1+1:cut2, 'class']='B'
df.ix[cut2+1:, 'class'] = 'C'

dfg = df.groupby('class')

counts = [len(v) for k, v in dfg]
total = float(sum(counts))
cases = len(counts)

widths = [c/total for c in counts]  

cax = df.boxplot(column='value', by='class', widths=widths)
cax.set_xticklabels(['%s\n$n$=%d'%(k, len(v)) for k, v in dfg])

enter image description here