python中按列分层的箱线图

python中按列分层的箱线图,python,matplotlib,pandas,boxplot,Python,Matplotlib,Pandas,Boxplot,我想为以下数据框绘制一个箱线图: > p1.head(10) N0_YLDF MAT 0 1.29 13.67 1 2.32 10.67 2 6.24 11.29 3 5.34 21.29 4 6.35 41.67 5 5.35 91.67 6 9.32 21.52 7 6.32 31.52 8 3.33 13.52 9 4.56 44.52 我希望箱线图为“N0_YLDF”

我想为以下数据框绘制一个箱线图:

> p1.head(10)

   N0_YLDF    MAT
0     1.29  13.67
1     2.32  10.67
2     6.24  11.29
3     5.34  21.29
4     6.35  41.67
5     5.35  91.67
6     9.32  21.52
7     6.32  31.52
8     3.33  13.52
9     4.56  44.52
我希望箱线图为“N0_YLDF”列,但它们应按“MAT”分层。当我使用foll时。命令:

p1.boxplot(column='N0_YLDF',by='MAT')
它使用所有唯一的MAT值,这些值在整个p1数据帧编号中约为15000。这导致了无法理解的箱线图

是否有任何方法可以对MAT值进行分层,以便得到不同的N0_YLDF箱线图,用于MAT值的第一个四分位,等等


谢谢

pandas.qcut
将为您提供分位数,但类似直方图的操作需要一些
numpy
技巧,这在这里很方便:

_, breaks = np.histogram(df.MAT, bins=5)
ax = df.boxplot(column='N0_YLDF', by='Class')
ax.xaxis.set_ticklabels(['%s'%val for i, val in enumerate(breaks) if i in df.Class])

数据帧现在看起来如下所示:

   N0_YLDF    MAT  Class
0     1.29  13.67      1
1     2.32  10.67      0
2     6.24  11.29      1
3     5.34  21.29      1
4     6.35  41.67      2
5     5.35  91.67      5
6     9.32  21.52      1
7     6.32  31.52      2
8     3.33  13.52      1
9     4.56  44.52      3

[10 rows x 3 columns]
它还可用于获得四分位图:

breaks = np.asarray(np.percentile(df.MAT, [25,50,75,100]))
df['Class'] = (df.MAT.values > breaks[..., np.newaxis]).sum(0)
ax = df.boxplot(column='N0_YLDF', by='Class')
ax.xaxis.set_ticklabels(['%s'%val for val in breaks])

熊猫有
cut
qcut
功能,可以轻松地对变量进行分层:

# Just asking for split into 4 equal groups (i.e. quartiles) here,
# but you can split on custom quantiles by passing in an array
p1['MAT_quartiles'] = pd.qcut(p1['MAT'], 4, labels=['0-25%', '25-50%', '50-75%', '75-100%'])
p1.boxplot(column='N0_YLDF', by='MAT_quartiles')
输出:


太好了,再次感谢您!是否有任何方法可以用实际的MAT分位数值替换x轴标签?这很简单,如果绘图返回为
ax
,则可以使用
breaks
:添加此
ax.xaxis.set_ticklebals(['%s'%val for i,val in enumerate(breaks)in if i in df.Class])
中断
包含直方图的bin边。感谢进一步编辑。我正在尝试使用pyplot.setp(ax['box',color='blue')更改箱线图中方框的颜色。但是,我得到错误“AxesSubplot”对象不可订阅”。你知道如何避免这个错误吗?谢谢啊,我找到了你(@CT Zhu)关于箱线图样式的回复。这很有效:很高兴听到这个。有时我甚至会找到自己的答案。快乐编码@马吕斯想做一个拉请求,将其添加到cookbook.rst?请以内联方式进行操作,以便图中所示的代码也与此代码一起显示-同时包含指向此问题的链接-thanks@Jeff:当然可以,我今晚会尽量抽出时间来做的。我一直想看看是否有任何有用的贡献,我可以添加到熊猫,这看起来是一个好地方开始。太好了!仅供参考,我想把更多的烹饪书的例子内联(他们现在大多是链接),所以如果你有时间,这将是非常有帮助的!