2011-01-10 2 views
1

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

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

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

+0

Создал минимальный пример, который рисует что-то на основе значений осей: http://pastebin.com/5EJC21wT – Heikki

+0

Я заметил, что исправление не видно, если 'includeInRanges' истинно. – Heikki

+0

«Как дата» помогли кучу. Теперь я получаю свои прямоугольники как на нескольких точках данных, так и на отдельных точках данных.Проблема в том, что в одиночных точках данных Im не получает полную ширину диаграммы. – Shawn

ответ

1

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

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

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

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

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

UPDATE # 2: SOLVED Итак, ось работает как минимальное/максимальное значение для Картезианского холста данных, но есть что-то важное для запоминания. Для одной точки (и, возможно, для нескольких точек, а я просто не мог визуально видеть разницу), при использовании пользовательских DateTimeAxis разбора функции, такие как то, что было в ASDoc учебники Adobe Flex:

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