Flex LineSeries - 沿曲线找到y值

时间:2010-02-27 06:16:22

标签: flex graph interpolation

我创建了一个Flex LineChart,可以显示长时间的高潮和低潮预测。我正在使用具有form =“curve”的LineSeries,它产生一个很好的正弦波图,代表水位随时间的变化。 X轴表示时间,Y轴表示水位。我必须处理的唯一数据点是高潮和低潮值,但我想弄清楚如何确定沿线的任意x值的y值。

例如,假设我有以下数据点:

var highLowTidePredictions:ArrayCollection = new ArrayCollection( [
     { Date: new Date(2010, 1, 26,  7, 15), waterLevel: 20.3 },
     { Date: new Date(2010, 1, 26, 13, 15), waterLevel: -1.2 },
     { Date: new Date(2010, 1, 26, 19, 15), waterLevel: 19.0 },
     { Date: new Date(2010, 1, 27,  1, 15), waterLevel: -1.0 },
     { Date: new Date(2010, 1, 27,  7, 15), waterLevel: 18.7 },
     { Date: new Date(2010, 1, 27, 13, 15), waterLevel:  0.7 } 
]);

这是我的折线图:

<mx:LineChart id="highLowLinePredictionsLineChart"
    width="100%" height="100%"
    dataProvider="{highLowTidePredictions}" 
    showDataTips="true">

    <mx:horizontalAxis>
            <mx:DateTimeAxis id="dta" />
    </mx:horizontalAxis>
    <mx:series>
            <mx:LineSeries id="lineSeries1" 
                   xField="Date" yField="waterLevel" 
                   form="curve" interpolateValues="true" sortOnXField="true"/>
    </mx:series>
</mx:LineChart>

我想知道2010年2月26日09:00的waterLevel

如果能做的话会很酷

var date:Date = new Date(2010, 1, 26, 9, 0);
var waterLevel:Number = lineSeries1.getYValue(date);

但是,getYValue(xValue)函数不存在。

2 个答案:

答案 0 :(得分:1)

LineSeries的interpolate属性将填充第一个和最后一个值之间的间隙。然而,您的问题似乎是您正在寻求通过提前估算来扩展曲线。插值在这种情况下不起作用。

我建议找到一个合适的水位数据估算回归模型,并应用它来得出曲线上的更多点。根据我有限的经验,我可以推荐一个依赖加权数据点的模型,称为样条曲线模型。但是,我不是统计学家,估计模型建议可能是错误的。

答案 1 :(得分:0)

好的,我明白了。只需要回到11年级的数学课。

对于任何好奇的人来说,这就是我提出的功能:

如果w1的高(或低)潮位为date1,而w2以下的低(或高)潮位为date2单位,则以下函数给出w处的水位date

private function getWaterLevel(date:Date, date1:Date, date2:Date, w1:Number, w2:Number):Number
{
    var t:Number = date.getTime();
    var t1:Number = date1.getTime();
    var t2:Number = date2.getTime();

    var A:Number = (w2 - w1) / 2;
    var B:Number = 2 * (t2 - t1);
    var C:Number = t1 + ((t2 - t1) / 2);
    var D:Number = w1 + ((w2 - w1) / 2);
    return A * Math.sin( ((2 * Math.PI)/B) * (t - C)) + D;  
}