Flex LineSeries - найти значение y по кривой

Я создал 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) функции не существует.


person echo    schedule 27.02.2010    source источник


Ответы (2)


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

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

person Sri    schedule 27.02.2010
comment
Я не собираюсь расширять кривую в любом направлении, а скорее хочу определить, какие значения отображаются вдоль визуализированной линии. Кажется, что если линия видна, должен быть способ определить значения y вдоль линии, но, возможно, это невозможно. - person echo; 27.02.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;  
}
person echo    schedule 27.02.2010