如何生成拉伸图的X值?

时间:2011-09-28 19:30:38

标签: groovy graph interpolation

我试图以某种方式“正常化”月度数据。

我的意思是,我需要记录每日价值,并根据另一个月的数据检查每个月的数据。

唯一的问题是,有些月份比其他月份长。所以我想出了一个我想要这样做的方法,但我对于如何做到这一点感到困惑......

基本上,我正在查看这个网站:http://paulbourke.net/miscellaneous/interpolation/并尝试将每组坐标转换为具有31个X值和Y值的图形(我想使用余弦插值器,但是我'我还在试图弄清楚该怎么做。)

现在,X值有一个功能。我可以传递类似(1..28)的内容并将其变换为31个值...简单的代码,这样的东西对我有用:

def total = (1..30)
def days = 28

def resize = {x, y->
    result = []
    x.each{ result << (it * (y/x.size())}
    return result
}

resize(total,days)

返回31个Y值的列表,范围从0到28。

我的问题是:如何将相应Y值的列表转换为这些值?我很难绕过这个概念,并且可以使用一些帮助。

我的第一个想法是简单地通过这个函数运行Y值,但是返回的值都低于原始输入。

我正在寻找能够在某些点保留值的东西,但只是水平拉伸图形。

例如,在图表长度的(1/3)处的x值处,该值必须与原始图表长度的(1/3)处的值相同。

任何人都可以帮我解决这个问题吗?这让我很难过。

提前致谢!

1 个答案:

答案 0 :(得分:4)

不确定问题出在哪里,所以我编写了一些数据

我认为你的算法是正确的,你只需要对x轴进行标准化。

我想出了这个代码(以及一些情节)来展示我认为的答案

定义一些x和y值:

def x = 1..30
def y = [1..15,15..1].flatten()

然后,以[ [ x, y ], [ x, y ], ...

的形式生成xy值列表
def xy = [x,y].transpose()

如果我们绘制此列表,我们得到:

a plot of the points from 1 to 30

然后定义一个normalize函数(基本上与你的相同,但它不会触及y值)

def normalize( xylist, days ) {
  xylist.collect { x, y -> [ x * ( days / xylist.size() ), y ] }
}

然后我们可以将列表规范化为28天

def normalxy = normalize( xy, 28 )

现在,如果我们绘制这些点,我们得到

a plot of the points from 1 to 28

如您所见,两个地块的形状相同,只是宽度不同......

我是否错过了这一点?