箱线图按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 有 cutqcut 函数可以轻松地对变量进行分层:

# 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中的列分层的主要内容,如果未能解决你的问题,请参考以下文章

为熊猫箱线图(groupby)设置无标题

同一图上的 Python 并排箱线图

更改 seaborn 箱线图中的 X 轴标签

Python Pandas 系列 if else 箱线图

Seaborn 和 Pandas,分组箱线图

使用 Plotly Graph 对象按中值对箱线图进行排序