【问题标题】:Boxplot stratified by column in python pandas箱线图按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 箱线图,依此类推......

谢谢!

【问题讨论】:

    标签: python matplotlib pandas boxplot


    【解决方案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)的箱线图样式。有效:stackoverflow.com/questions/19453994/…
    • 很高兴听到这个消息。有时我什至会找到自己的答案。编码愉快!
    猜你喜欢
    • 1970-01-01
    • 2018-08-01
    • 2021-08-28
    • 2018-04-15
    • 2016-06-11
    • 1970-01-01
    • 2020-08-03
    • 2017-08-09
    • 1970-01-01
    相关资源
    最近更新 更多