Как создать настраиваемый столбец/метку x фиксированной ширины?

Цель: создание столбцов с фиксированной шириной месяцев для данных.
Проблема: ширина столбца зависит от точки #data. Следовательно, некоторые ярлыки группируются вместе
(например, "JanFeb" и "Jan....Feb") из-за отсутствия данных за конкретный месяц.

Следующий фрагмент кода создает новые метки в месяц, но не управляет статическим размещением меток по оси x; поэтому некоторые метки могут объединяться, если для этого конкретного месяца существует мало элементов данных (меньше точек):

    for (PerformanceDataItem *item in perfDataArray) {
    if (![item.month isEqualToString:currentMonth]) {
        currentMonth = item.month;
        CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:item.month textStyle:x.labelTextStyle];
        newLabel.tickLocation = [[NSDecimalNumber numberWithInt:index] decimalValue];
        newLabel.offset = 2;
        [customLabels addObject:newLabel];
        [newLabel release]; 
    }
    ++index;    
} // end for().

x.axisLineStyle = nil;
x.majorTickLineStyle = nil;
x.minorTickLineStyle = nil;
x.labelingPolicy =  CPTAxisLabelingPolicyNone;


NSSet* customlabelSet = [NSSet setWithArray:customLabels];
x.axisLabels = customlabelSet; 

Вопрос. Как создать настраиваемый набор столбцов фиксированной ширины для отображения данных?

...merely setting x.labelingPolicy to

CPTAxisLabelingPolicyFixedInterval
clutters the x-axis with a lot of numerals (1.0 - x.0) vs using my own NSString labels.

Также пробовали: а) изменить plotSpace.xRange; и б) изменение x.majorIntervalLength.

Предпочтение: пользовательский ярлык для: CPTAxisLabelingPolicyFixedInterval

P.S. Я предполагаю, что расширение тонких столбцов (с меньшим количеством данных) просто нанесет экстраполяцию на следующую точку данных следующего месяца; без необходимости заполнять какие-либо отсутствующие точки данных, чтобы сравняться с набором точек за соседний месяц.

============================

Решение на основе комментария:

plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromUnsignedInteger(0) length:CPTDecimalFromUnsignedInteger(100)];

axisFixedInterval.majorIntervalLength = CPTDecimalFromDouble(25.0); NSDateComponents *dateComponents = [[NSDateComponents alloc] init];

// Set begining date to April 1, 2012:
[dateComponents setMonth:4];
[dateComponents setDay:1];
[dateComponents setYear:2012];
[dateComponents setHour:0];
[dateComponents setMinute:0];
[dateComponents setSecond:0];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *refDate = [gregorian dateFromComponents:dateComponents];
[dateComponents release];
[gregorian release];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateStyle = kCFDateFormatterMediumStyle;
[dateFormatter setDateFormat:@"MMM"];


CPTCalendarFormatter *calFormatter = [[[CPTCalendarFormatter alloc] initWithDateFormatter:dateFormatter] autorelease];
calFormatter.referenceDate = refDate;
calFormatter.referenceCalendarUnit = kCFCalendarUnitMonth;

axisFixedInterval.labelFormatter = calFormatter;

[dateFormatter release];

... это дало бы мне фиксированное распределение трехсимвольных месяцев: [апрель, май, июнь, июль, август]; для 5 галочек.

... из примера plot_gallery_ios.


person Frederick C. Lee    schedule 27.09.2012    source источник


Ответы (1)


Вы можете использовать политику маркировки CPTAxisLabelingPolicyFixedInterval и labelFormatter, которая создает метки месяца. Core Plot предоставляет два разных средства форматирования даты, которые могут помочь: CPTCalendarFormatter и CPTTimeFormatter. Какой из них вы выберете, зависит от того, как вы кодируете значения даты в своем наборе данных.

person Eric Skroch    schedule 29.09.2012