Flex LineSeries - найти значение y вдоль кривой - PullRequest
0 голосов
/ 27 февраля 2010

Я создал Flex LineChart, который показывает прогнозы приливов и отливов с течением времени. Я использую LineSeries с form = "curve", которая создает хороший синусоидальный волновой график, отображающий уровень воды во времени. Ось X представляет время, а ось Y представляет уровень воды. Единственными точками данных, с которыми мне приходится работать, являются значения прилива и отлива, но я хотел бы выяснить, как определить значения y произвольных значений x вдоль линии.

Например, допустим, у меня есть следующие точки данных:

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>

И я хочу знать waterLevel 26 февраля 2010 года в 09:00.

Было бы круто, если бы я мог сделать

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

Но, увы, этой функции getYValue(xValue) не существует.

Ответы [ 2 ]

1 голос
/ 27 февраля 2010

Свойство интерполяции LineSeries заполнит пробелы между первым и последним значениями. Однако по вашему вопросу кажется, что вы хотите расширить кривую, оценив вперед. Интерполировать в этом случае не получится.

Я бы предложил найти подходящую регрессионную модель оценки данных об уровне воды и применить ее, чтобы получить больше точек на кривой. Исходя из своего ограниченного опыта, я мог бы рекомендовать модель, зависящую от взвешенных точек данных, называемую сплайн-моделью. Однако я не являюсь статистиком и могу ошибаться в отношении рекомендации по модели оценки.

0 голосов
/ 28 февраля 2010

Хорошо, я понял это. Просто пришлось вернуться в 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;  
}
...