箱线图按python pandas中的列分层
Posted
技术标签:
【中文标题】箱线图按python pandas中的列分层【英文标题】:Boxplot stratified by column in python pandas 【发布时间】:2014-06-07 14:50:52 【问题描述】:我想为以下 pandas 数据框绘制箱线图:
> 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 数据帧数中约为 15,000。这会导致无法理解的箱线图。
有什么方法可以对 MAT 值进行分层,以便为 MAT 值的第一个四分位数获得不同的 N0_YLDF 箱线图,依此类推......
谢谢!
【问题讨论】:
【参考方案1】:Pandas 有 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')
输出:
【讨论】:
@Marius 想要做一个拉取请求以将其添加到 cookbook.rst?请内联进行,以便该图也与代码一起显示-还包括指向此问题的链接-谢谢 @Jeff:当然,今晚我会努力解决这个问题。我一直想看看是否有任何有用的贡献可以添加到 pandas,这看起来是个不错的起点。 太棒了!仅供参考,我想将更多的食谱示例内联(它们现在主要是链接),所以如果你有时间,这将非常有帮助!【参考方案2】: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])
【讨论】:
这太好了,再次感谢您!有什么方法可以用实际的 MAT 分位数值替换 x 轴标签? 这很简单,您可以使用breaks
的值,如果绘图返回为ax
:添加此ax.xaxis.set_ticklabels(['%s'%val for i, val in enumerate(breaks) if i in df.Class])
,breaks
包含直方图的 bin 边缘。
感谢您的进一步编辑。我正在尝试使用 pyplot.setp(ax['boxes'], color='blue') 更改箱线图中框的颜色。但是我得到错误''AxesSubplot'对象是不可订阅的'。关于如何避免此错误的任何想法?谢谢!
啊,我找到了你的这个回复(@CT Zhu)的箱线图样式。有效:***.com/questions/19453994/…
很高兴听到这个消息。有时我什至会找到自己的答案。编码愉快!以上是关于箱线图按python pandas中的列分层的主要内容,如果未能解决你的问题,请参考以下文章