Столбцы, не выровненные по тикам оси X на графике CPTBarPlot Core Core - PullRequest
2 голосов
/ 07 декабря 2011

У меня проблема с CPTBarPlot в Core Plot на Какао. А именно, я не могу добиться, чтобы контролировать ширину шага баров. Тики по оси X обычно задаются как целое число от 1 до бесконечности, и рисование на нем графика рассеяния работает.

Однако, когда рисуется гистограмма, только первые столбцы начинаются (с правильным смещением, конечно) с первого тика. Второе немного дальше от его галочки, третье и все остальные, как показано на скриншоте:

enter image description here

Я не нашел ни одного свойства для управления этим, однако нашел метод источника данных

-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index

Ведет себя иначе, чем когда я рисую Scatter Plot. а именно, он перечисляет только целое число 3, которое является CPTBarPlotBindingBarTips и не перечисляет другие константы, особенно меня беспокоит отсутствие CPTBarPlotBindingBarLocations.

Если я запускаю VerticalBarChart из демонстрационного проекта Mac для Plot Gallery, я проверил и увидел, что тот же метод перечисляет 3,4 и 2 константы в том же порядке.

Я использую Core Plot 0.9, а именно, я верю так же, как в этой демонстрации. Тем не менее ...

Как это решить?

Вот полный код для меток и отметок на оси X;

    x.labelRotation = M_PI/4;
    x.labelingPolicy = CPTAxisLabelingPolicyNone;
    x.labelOffset = 0.0;

    CPTMutableTextStyle *labelStyle = [CPTMutableTextStyle textStyle];
    labelStyle.fontSize = 9.0;
    x.labelTextStyle = labelStyle;

//    NSMutableArray *dateArray = [dataSeries objectAtIndex:0];
    NSMutableArray *customTickLocations = [NSMutableArray array];
    NSMutableArray *xAxisLabels = [NSMutableArray array];

    for (int i=0;i<[dataSeries count];i++) {

        [customTickLocations addObject:[NSDecimalNumber numberWithInt:i+1]];
        [xAxisLabels addObject:[dataSeries objectAtIndex:i]];

    }

    //    [customTickLocations addObject:[NSDecimalNumber numberWithInt:[dateArray count]]];

    NSUInteger labelLocation = 0;
    NSMutableArray *customLabels = [NSMutableArray arrayWithCapacity:[xAxisLabels count]];
    for (NSNumber *tickLocation in customTickLocations) {
        CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText: [xAxisLabels objectAtIndex:labelLocation++] textStyle:x.labelTextStyle];
        newLabel.tickLocation = [tickLocation decimalValue];
        newLabel.offset = x.labelOffset + x.majorTickLength;
        newLabel.rotation = M_PI/4;
        [customLabels addObject:newLabel];
        [newLabel release];
    }

    [x setMajorTickLocations:[NSSet setWithArray:customTickLocations]];

    x.axisLabels =  [NSSet setWithArray:customLabels];

Я должен добавить, что одни и те же галочки используются, когда график рассеяния рисуется на одном и том же участке графика, и он идеально соответствует ....

1 Ответ

2 голосов
/ 08 декабря 2011

Параметр field будет одним из членов этого перечисления:

typedef enum _CPTBarPlotField {
    CPTBarPlotFieldBarLocation = 2, ///< Bar location on independent coordinate axis.
    CPTBarPlotFieldBarTip      = 3, ///< Bar tip value.
    CPTBarPlotFieldBarBase     = 4  ///< Bar base (used only if barBasesVary is YES).
} CPTBarPlotField;

Если свойство графика plotRange равно нулю (по умолчанию), график запросит у источника данных местоположения и советы для каждого бара. Если barBasesVary == ДА, он также будет запрашивать базовые значения для каждого бара.

...