在x的范围内运行y值的中值

ika*_*ros 13 python numpy scatter matplotlib median

下面是我用两个numpy数组构建的散点图.

散点图示例 在此输入图像描述

我想在这个图中添加的是y在x范围内的运行中位数.我在一个例子中拍照:

修改的散点图 在此输入图像描述

具体来说,我需要两个值之间x轴上1个单位的数据点的中位数(这个范围会在很多图之间变化,但我可以手动调整它).我感谢任何可以指向正确方向的提示.

Hoo*_*ked 10

我会用np.digitize你做bin分类.这样,您可以轻松应用任何功能并设置您感兴趣的范围.

import numpy as np
import pylab as plt

N = 2000
total_bins = 10

# Sample data
X = np.random.random(size=N)*10
Y = X**2 + np.random.random(size=N)*X*10

bins = np.linspace(X.min(),X.max(), total_bins)
delta = bins[1]-bins[0]
idx  = np.digitize(X,bins)
running_median = [np.median(Y[idx==k]) for k in range(total_bins)]

plt.scatter(X,Y,color='k',alpha=.2,s=2)
plt.plot(bins-delta/2,running_median,'r--',lw=4,alpha=.8)
plt.axis('tight')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

作为该方法的多功能性的一个例子,让我们添加每个bin的标准偏差给出的错误栏:

running_std    = [Y[idx==k].std() for k in range(total_bins)]
plt.errorbar(bins-delta/2,running_median,
              running_std,fmt=None)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Aco*_*rbe 5

这个问题也可以通过python pandas(Python 数据分析库)有效地解决,它提供了原生的数据切割和分析方法。

考虑这个

(感谢@Hooked 并为他的示例 +1,我从中借用了数据XY数据)

 import pandas as pd
 df = pd.DataFrame({'X' : X, 'Y' : Y})  #we build a dataframe from the data

 data_cut = pd.cut(df.X,bins)           #we cut the data following the bins
 grp = df.groupby(by = data_cut)        #we group the data by the cut

 ret = grp.aggregate(np.median)         #we produce an aggregate representation (median) of each bin

 #plotting

 plt.scatter(df.X,df.Y,color='k',alpha=.2,s=2)
 plt.plot(ret.X,ret.Y,'r--',lw=4,alpha=.8)
 plt.show()
Run Code Online (Sandbox Code Playgroud)

备注:这里红色曲线的 x 值是 bin-wise x 中值(可以使用 bin 的中点)。

在此处输入图片说明