Flex Charts: Можете ли вы использовать минимальную / максимальную точку из IAxis для Cartesian Data Canvas, чтобы нарисовать всю ширину диаграммы? - PullRequest
1 голос
/ 10 января 2011

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

Однако, когда у меня есть только одна точка данных, я не могуполучить прямоугольники для рисования.Поскольку я хочу, чтобы мои прямоугольники охватывали всю ширину диаграммы, я думал, что смогу получить координаты 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 использует значение данных в массиве для определениявертикальные границы моих прямоугольников.

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

1 Ответ

1 голос
/ 10 января 2011

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

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

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

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

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

UPDATE # 2: решено Хорошо, поэтому ось работает как минимальное / максимальное значения для декартовойData Canvas, но есть кое-что важное, что нужно запомнить.Для одной точки (и, вероятно, для нескольких точек, я просто не мог видеть разницу) при использовании пользовательской функции синтаксического анализа 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 их значения времени также устанавливаются на локальное системное время.Не забудьте также установить эти значения на ноль, иначе вы получите точки, которые точно не совпадают с метками осей.

...