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

时间:2014-04-22 11:14:10

标签: python numpy matplotlib median scatter

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

散点图示例 enter image description here

我要添加到此图中的是y在x范围内的运行中位数。我在一个例子中拍照:

修改的散点图 enter image description here

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

4 个答案:

答案 0 :(得分: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()

enter image description here

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

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

enter image description here

答案 1 :(得分:4)

此问题也可以通过python pandas(Python数据分析库)有效解决,它提供本机数据剪切和分析方法。

考虑一下

(我借用了XY数据的例子,以及@Hooked给我的实例

 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()

备注:这里红色曲线的x值是逐个x-medians(可以使用箱子的中点)。

enter image description here

答案 2 :(得分:3)

您可以创建一个基于numpy.median()的函数,该函数将计算给定间隔的中值:

import numpy as np

def medians(x, y, intervals):
    out = []
    for xmin, xmax in intervals:
        mask = (x >= xmin) & (x < xmax)
        out.append(np.median(y[mask]))
    return np.array(out)

然后在期望的时间间隔内使用此功能:

import matplotlib.pyplot as plt

intervals = ((18, 19), (19, 20), (20, 21), (21, 22))
centers = [(xmin+xmax)/2. for xmin, xmax in intervals]

plt.plot(centers, medians(x, y, intervals)

答案 3 :(得分:1)

我在C#写了这样的话。我不做Python,所以这里是伪代码:

  • 创建一个List以用于中位数将来自
  • 的数据
  • x
  • 排序散点图
  • x
  • 循环排序点
  • 为每个点将该点的Y值插入到中间列表中,以便中值列表作为排序列表增长。即插入Y以使其上下的List值>和&lt;它分别。看看这里:Inserting values into specific locations in a list in Python
  • 在添加每个Y值后,中间值将是当前中间索引的列表值,即List(List.Length/2)

希望它有所帮助!