Core Plot 1.0: Barchart начинается с неправильной полосы (в зависимости от Barplot.Offset) - PullRequest
1 голос
/ 03 марта 2012

Проблема

Я рисую гистограмму с Базовая диаграмма .Моя реализация numberForPlot в качестве источника данных, кажется, возвращает значения правильно.Однако в зависимости от настройки barPlot.Offset диаграмма начинается с неверного значения.

Реализация источника данных

Я реализовал источник данных следующим образом:

- (NSArray *)numbersForPlot:(CPTPlot *)plot 
                 field:(NSUInteger)fieldEnum 
      recordIndexRange:(NSRange)indexRange; 

if(fieldEnum == 3) {

NSString *coa = [[NSString alloc] init];
coa = (NSString*)[plot identifier];

NSMutableArray *values = [[NSMutableArray alloc] init] ;
for (IBFinPeriod *fp in periodsArray) {
    NSNumber *value = [self.company valueForCoa:coa FiscalYear:[fp FiscalYear] FiscalPeriod:[fp FiscalPeriod]];
    [values addObject:value];
    }
NSLog(@"plot values: %@",values);
return values;

}
else

    return    [[NSArray alloc]initWithObjects:[NSDecimalNumber numberWithFloat:1.0],
               [NSDecimalNumber numberWithFloat:2.0],
               [NSDecimalNumber numberWithFloat:3.0],
               [NSDecimalNumber numberWithFloat:4.0],
               [NSDecimalNumber numberWithFloat:5.0],
               nil]; 
}

ЭтоКод возвращает y-значения : «1841.059», «2492.619», «3011.582», «2643.865», «2914.845», «3470.457», что правильно.

Смещение барплота

Однако, только когда barPlot.barOffset = CPTDecimalFromFloat(-0.50f); , график начинается правильно с первого значения слева.

chart with barPlot.offset = -0.50f

Если для barPlot.barOffset установлено значение 0, оно начинается с левой половины последнего значения (3470.57):

chart with barPlot.offset = 0.00f

Настройка диаграммы

Это код для настройки диаграммы:

- (void) setChart;

{graph1 = [[CPTXYGraph alloc] initWithFrame: self.view.bounds];

CPTTheme *theme = [CPTTheme themeNamed:kCPTPlainWhiteTheme];
[graph1 applyTheme:theme];
self.chartLeft.hostedGraph = graph1;
graph1.plotAreaFrame.masksToBorder = NO;


// Border
graph1.plotAreaFrame.borderLineStyle = nil;
graph1.plotAreaFrame.cornerRadius = 5.0f;

// Paddings
graph1.paddingLeft  = 10.0;
graph1.paddingTop   = 10.0;
graph1.paddingRight = 10.0;
graph1.paddingBottom = 10.0;

graph1.plotAreaFrame.paddingLeft = 50.0;
graph1.plotAreaFrame.paddingTop = 20.0;
graph1.plotAreaFrame.paddingRight = 20.0;
graph1.plotAreaFrame.paddingBottom = 50.0;
graph1.plotAreaFrame.backgroundColor = nil;

graph1.paddingLeft = 20.0;
graph1.paddingTop = 20.0;
graph1.paddingRight = 20.0;
graph1.paddingBottom = 20.0;

// Setup plot space
// The plot space determines the data ranges that are visible in the graph, not its physical size in the view
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph1.defaultPlotSpace;
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(4000.0f)];
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(5.0f)];

CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph1.axisSet;
CPTXYAxis *x          = axisSet.xAxis;
x.axisLineStyle               = nil;
x.majorTickLineStyle          = nil;
x.minorTickLineStyle          = nil;
x.majorIntervalLength         = CPTDecimalFromString(@"1");
x.orthogonalCoordinateDecimal = CPTDecimalFromString(@"0");
x.title                       = @"X Axis";
x.titleLocation               = CPTDecimalFromFloat(7.5f);
x.titleOffset                 = 55.0f;

// Custom labels omitted...

CPTXYAxis *y = axisSet.yAxis;
y.axisLineStyle               = nil;
y.majorTickLineStyle          = nil;
y.minorTickLineStyle          = nil;
y.majorIntervalLength         = CPTDecimalFromString(@"1000");
y.orthogonalCoordinateDecimal = CPTDecimalFromString(@"0");
y.title                       = @"Y Axis";
y.titleOffset                 = 45.0f;
y.titleLocation               = CPTDecimalFromFloat(150.0f);

// First bar plot
CPTBarPlot *barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor darkGrayColor] horizontalBars:NO];
barPlot.baseValue  = CPTDecimalFromString(@"0");
barPlot.barOffset  = CPTDecimalFromFloat(-0.50f);
barPlot.identifier = @"SOPI";
barPlot.dataSource = self;
[graph1 addPlot:barPlot toPlotSpace:plotSpace];    

}

Вопрос

Что не так с моей реализацией?

1 Ответ

0 голосов
/ 04 марта 2012

Я нашел решение своей проблемы:

В моем операторе возврата для значений x отсутствовал numberWithFloat 6.0

return    [[NSArray alloc]initWithObjects:[NSDecimalNumber numberWithFloat:1.0],
           [NSDecimalNumber numberWithFloat:2.0],
           [NSDecimalNumber numberWithFloat:3.0],
           [NSDecimalNumber numberWithFloat:4.0],
           [NSDecimalNumber numberWithFloat:5.0],
           nil]; 

Кроме того, длина в plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(5.0f)] была только 5. Однако у меня есть 6 x-значений. Я установил длину до 6,5 в настоящее время. Тем не менее, при установке его на 6,0, правая полоса отображается

...