Гибкие диаграммы: можете ли вы использовать точку минимума / максимума из IAxis для декартовых данных Canvas, чтобы нарисовать всю ширину диаграммы?

У меня есть диаграмма с осью DateTime в качестве моей горизонтальной и линейной осью для моей вертикали внутри линейной диаграммы Adobe Flex. Я хочу использовать холст с декартовыми данными в качестве фонового элемента и рисовать настраиваемый набор фоновой графики, в основном прямоугольники. Когда у меня есть более одной точки данных, графика работает отлично, поскольку предполагается, что они занимают ширину всей диаграммы.

Однако, когда у меня есть только одна точка данных, я не могу нарисовать прямоугольники. Поскольку я хочу, чтобы мои прямоугольники занимали всю ширину диаграммы, я думал, что могу получить координаты x по моей оси, но это не работает.

var canvasWidth:Number = chtCanvas.width;
var canvasHeight:Number = chtCanvas.height; 
var minPt:Array;
var maxPt:Array;
var minPtDate:Date;
var maxPtDate:Date;
var minPtComplete:Point;
var maxPtComplete:Point;

// This works fine when there is more than 1 data point
minPt = chtCanvas.localToData(new Point(0, 0));
maxPt = chtCanvas.localToData(new Point(canvasWidth,canvasHeight));

//This does return a date object, but wont draw below 
minPtDate = axisDate.minimum;
maxPtDate = axisDate.maximum;

//This returns NaN for the x
minPtComplete = chtCanvas.dataToLocal(minPtDate, axisSalary.minimum);
maxPtComplete = chtCanvas.dataToLocal(maxPtDate, axisSalary.maximum);

// Also tried this.  Also returns NaN for the x value
//minPtComplete = chtCanvas.dataToLocal(axisDate.minimum, axisSalary.minumum);
//maxPtComplete = chtCanvas.dataToLocal(axisDate.maximum, axisSalary.maximum);

Мой фактический метод рисования выглядит следующим образом:

// Tried this, works with points >2, does not draw with single data point
chtCanvas.drawRect(minPt[0], detail[i].MaxValue, maxPt[0], detail[i].MinValue);

//tried this, no effect with single point
//chtCanvas.drawRect(minPtDate, detail[i].MaxValue, maxPtDate, detail[i].MinValue);

// Tried this, no effect with single point
//chtCanvas.drawRect(minPtDate, minPt[1], maxPtDate, detail[i].MinValue);

// Tried this also
//chtCanvas.drawRect(minPtComplete.x, detail[i].MaxValue, maxPtComplete.x, detail[i].MinValue);

В этом примере деталь - это массив значений заработной платы, а Im использует значение данных в массиве для определения вертикальных границ моих прямоугольников.

Мне нужно нарисовать прямоугольники по всей ширине диаграммы (даже если есть только одна точка данных). Спасибо


person Shawn    schedule 10.01.2011    source источник
comment
Создан минимальный пример, который рисует что-то на основе значений оси: pastebin.com/5EJC21wT   -  person Heikki    schedule 10.01.2011
comment
Я заметил, что прямоугольник не отображается, если includeInRanges не истинно.   -  person Heikki    schedule 10.01.2011
comment
Как Дата помогла кучу. Теперь я получаю свои прямоугольники как на нескольких точках данных, так и на отдельных точках данных. Проблема в том, что на отдельных точках данных я не получаю полную ширину диаграммы.   -  person Shawn    schedule 10.01.2011
comment
Я обнаружил, что вызывается функция синтаксического анализа dateTimeAxis и передаются значения, которые Flex создает для autoAdjust (добавляет дополнительные даты, чтобы указать отметки дней / недель и т. Д.). Я также решил передать эти значения в свой DateFormatter, и значения оси начали меняться. работать на меня.   -  person Shawn    schedule 10.01.2011


Ответы (1)


Спасибо Хейкки за его помощь. Следующий код предназначен для использования значений оси для рисования на холсте декартовых данных:

chtCanvas.drawRect(axisDate.minimum as Date, axisSalary.maximum, axisDate.maximum as Date, axisSalary.minimum);

Приведение значений как Date действительно помогло. Остальной код, использованный выше, не нужен.

Следует отметить, что я использовал DateFormatter для форматирования значений даты из моих данных. Я не учел, что при использовании DateTimeAxis Flex автоматически добавит дополнительные даты для отображения на оси. В моем случае я использовал настраиваемую функцию синтаксического анализа для создания МОИХ точек, но не учел точки, которые создавал Flex, а также передавал моей функции синтаксического анализа (следовательно, они не обрабатывались правильно). Как только я исправил это, значения отображались правильно в случае нескольких точек данных. У меня все еще есть небольшая проблема с отдельными точками данных, и они не полностью заполняют диаграмму, но теперь они рисуются.

ОБНОВЛЕНИЕ. Хотя есть признаки жизни, минимальные и максимальные значения все еще не отображают всю ширину диаграммы в некоторых случаях в зависимости от комбинации dataUnits и labelUnits.

ОБНОВЛЕНИЕ №2: РЕШЕНО. Итак, ось работает как минимальное / максимальное значения для холста декартовых данных, но есть кое-что важное, что нужно запомнить. Для одной точки (и, вероятно, для нескольких точек, я просто не мог визуально увидеть разницу) при использовании настраиваемой функции синтаксического анализа DateTimeAxis, такой как та, что была в учебниках Adobe Flex ASDoc:

private function axisDateParseFunction(item:String):Date
{   
     var inputDate:String = item;
     inputDate = fmtDate.format(inputDate);

     var newDate:Date = new Date();
     if(inputDate)
     {
        var a:Array = inputDate.split('/');
        newDate.fullYear = a[2];
        newDate.month = a[0] - 1;
        newDate.date = a[1];
        newDate.hours = 0;
        newDate.hoursUTC = 0;
        newDate.minutes = 0;
        newDate.minutesUTC = 0;
        newDate.seconds = 0;
        newDate.secondsUTC = 0;
        newDate.milliseconds = 0;
        newDate.millisecondsUTC = 0;

     }
     return newDate;

}

Вы ДОЛЖНЫ не забыть установить значения UTC, как показано выше. Поскольку DateTimeAxis использует дату И время, при создании новых объектов Date их значения времени также устанавливаются на местное системное время. Не забудьте также установить эти значения на ноль, иначе вы получите точки, которые не точно совпадают с метками ваших осей.

person Shawn    schedule 10.01.2011