0

我创建了一个 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>

我想知道waterLevel2010 年 2 月 26 日 09:00。

如果我能做到就好了

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

但是很可惜,这个getYValue(xValue)功能不存在。

4

2 回答 2

1

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

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

于 2010-02-27T06:27:07.023 回答
0

好的,我想通了。只好回到 11 年级的数学课。

对于任何好奇的人,这是我想出的功能:

If the high(or low) tide is w1 units at date1 and the following low(or high) tide is w2 units at date2, then the following function gives the water level w at 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;  
}
于 2010-02-27T22:38:09.643 回答